Что не так с приведенным ниже кодом? Ожидаемый X, измененный потоком Func 1, за которым следует X, измененный потоком Func 2

Изучая многопоточность, я написал следующий код, но на экране не было вывода. Что я здесь делаю неправильно? Я ожидал, что результат будет следующим:

X modified by threadFunc 1
X modified by threadFunc 2 

но на экране ничего не видно и программа не выходит.

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

pthread_mutex_t globalMutex[2];
pthread_cond_t globalCondVar[2];

void *threadFunc1(void *args)
{
   pthread_mutex_lock(&globalMutex[0]);
   pthread_cond_wait(&globalCondVar[0], &globalMutex[0]);
   printf("X modified by threadFunc 1\n");
   pthread_mutex_unlock(&globalMutex[0]);
}

void *threadFunc2(void *args)
{
    pthread_mutex_lock(&globalMutex[1]);
    pthread_cond_wait(&globalCondVar[1], &globalMutex[1]);
    printf("X Modified by threadFunc 2\n");
    pthread_mutex_unlock(&globalMutex[1]);
}

int main()
{
    pthread_t thread[2];

    pthread_mutex_init(&globalMutex[0], NULL);
    pthread_mutex_init(&globalMutex[1], NULL);
    pthread_cond_init(&globalCondVar[0], NULL);
    pthread_cond_init(&globalCondVar[1], NULL);

    pthread_create(&thread[0], NULL, threadFunc1, NULL);
    pthread_create(&thread[1], NULL, threadFunc2, NULL);

    pthread_cond_signal(&globalCondVar[0]);
    pthread_cond_signal(&globalCondVar[1]);

    pthread_join(thread[1], NULL);
    pthread_join(thread[0], NULL);

    pthread_cond_destroy(&globalCondVar[0]);
    pthread_cond_destroy(&globalCondVar[1]);
    pthread_mutex_destroy(&globalMutex[0]);
    pthread_mutex_destroy(&globalMutex[1]);

    return 0;
}

person Trickmaster    schedule 07.08.2017    source источник
comment
Вы, вероятно, сигнал слишком рано. Включите функцию sleep() перед сигналом main().   -  person Bjorn A.    schedule 07.08.2017
comment
Кроме того, функции потока возвращают что-то   -  person Bjorn A.    schedule 07.08.2017
comment
Что @BjornA. говорит. Подождите немного или замените кондвары семафорами.   -  person Martin James    schedule 07.08.2017


Ответы (1)


Переменные условия не являются событиями. Они предназначены для использования с фактическими булевыми условиями, защищенными мьютексами.

   (Init)
   condition = false

   (Signal)
   lock mutex
   condition = true
   signal condvar
   unlock mutex

   (Wait)
   lock mutex
   while not condition:
       wait condvar

Это стандартный способ использования условных переменных.

person n. 1.8e9-where's-my-share m.    schedule 07.08.2017