count_mutex
и count_threshold_cv
не инициализированы, добавьте:
int main()
{
pthread_mutex_init(&count_mutex, NULL);
pthread_cond_init(&count_threshold_cv, NULL);
//...
E1_ptr
не инициализировано.Есть много способов ее решения:
Вы можете позвонить malloc
, чтобы выделить память:
struct example *E1_ptr = malloc(sizeof(struct example));
E1_ptr->a = 0;
E1_ptr->i = 0;
или удерживать указатель на локальную переменную:
struct example ex;
struct example *E1_ptr = &ex; //malloc(sizeof(struct example));
E1_ptr->a = 0;
E1_ptr->i = 0;
или
struct example ex;
ex.a = 0;
ex.i = 0;
затем создать поток с функцией pthread_create(&inc_x_thread, NULL, inc_x, &ex)
pthread_cond_signal
не ждет.Если поток заблокирован условной переменной pthread_cond_signal
, функция разблокирует этот поток, в противном случае немедленно возвращается без ожидания и ничего не делает.Таким образом, ваш цикл for с 10 итерациями выполняется как можно быстрее, без ожидания вызова pthread_cond_wait
.Так что можете переписать ваш цикл for в бесконечный цикл, вызывая pthread_cond_signal
несколько раз.
if(pthread_create(&inc_x_thread, NULL, inc_x, E1_ptr)) {
printf("Error creating thread\n");
}
while(1) { // INFINITE LOOP
if(pthread_cond_signal(&count_threshold_cv)) {
printf("Error Signaling thread at sample = %d\n",i);
}
if (taskDone) // testing global flag, if 1 break
break; // it means inc_x thread has ended
}
if(pthread_join(inc_x_thread, NULL)) { // it was pointed out in comment
printf("Error joining thread\n"); // you need to join at the end of main function
}
taskDone
является глобальным int , со значением по умолчанию 0.Он устанавливается на 1
до вызова pthread_exit
в функции inc_x
.Установка / проверка taskDone
должна быть заключена в некоторый механизм синхронизации, например, путем добавления нового мьютекса или использования count_mutex
.