Выходные данные меняются при каждом запуске программы (Cpthread, семафоры) - PullRequest
0 голосов
/ 03 ноября 2019

Ниже приведен код, содержащий только основные части. Каждый раз, когда код запускается, выходные данные меняются, я предполагаю, что это происходит из-за того, что thread 1 не запускается, но я озадачен тем, как это исправить.

Я стремлюсь к значению i, чтобыдобавить в 10 раз в thread 1, а затем уменьшить в 10 раз в thread 2, но я не знаю, почему это не происходит при каждом проходе.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>

int i = 0;
int temp = 0;
sem_t delayT;
sem_t sync;

void * thread1(void * p)
{
    sem_wait(&delayT);
    while(i>0)
    {
        sem_wait(&sync);
        i--;
        temp = i;
        printf("Out:%d\n",i);
        sem_post(&sync);
        if(temp==0)
            sem_wait(&delayT);
    }
}



void * thread2(void * p)
{
    while(i<10)
    {
        sem_wait(&sync);
        i++; 
        printf("in:%d\n",i);
        if(i==10)
            sem_post(&delayT);
        sem_post(&sync);
    }
}

int main (int argc, char * argv[]) {
    pthread_t t1;
    pthread_t t2;

    sem_init(&delayT,0,0);
    sem_init(&sync,0,1);

    pthread_create (&t1, NULL, thread1, NULL);
    pthread_create (&t2, NULL, thread2, NULL);

    pthread_join (t2, NULL);
}

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Я полагаю, что вам не хватает pthread_join. вы ждете поток производителя, но не получателя, затем программа останавливается, прежде чем поток 1 достигнет конца своего обратного отсчета.

Добавить

 pthread_join(t1, NULL);

в конце

0 голосов
/ 03 ноября 2019

У вас есть состояние гонки. В теме 2:

if(i==10)
    sem_post(&delayT);
sem_post(&sync);

После публикации delayT T1 может продвинуться вперед;затем после синхронизации сообщений T2 T1 может продвинуться дальше, так что к тому времени, когда T2 проверит свое состояние while, i будет меньше 10. Вы можете распутать его дальше, чтобы увидеть действительный набор выходов, но я уверен, что их много.

Простое перемещение sem_post (& delayT) за пределы цикла должно исправить это;но вы, возможно, захотите рассмотреть некоторые другие подходы к решению этой проблемы.

0 голосов
/ 03 ноября 2019

относительно: для значения i, которое будет добавлено в 10 раз в потоке 1, а затем уменьшено в 10 раз в потоке 2,

значение i НЕ добавляется впоток 1.

значение i НЕ уменьшается в потоке 2.

Таким образом, либо опубликованный код неверен, либо описание проблемы неверно.

...