Следующий фрагмент кода записывается для печати четного числа с одним потоком и нечетным числом с другим потоком.Почему этот код pthread просто висит?
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define LIMIT 100
int counter;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void* function(void *p)
{
int expected = *(int *)p;
while(expected < LIMIT)
{
pthread_mutex_lock(&mutex1);
while (counter != expected);
printf("%d\n", counter++);
expected += 2;
pthread_mutex_unlock(&mutex1);
};
exit(0);
}
int main(int argc, char *argv[])
{
pthread_t thread1, thread2;
int counter = 0;
int expected_0 = 0, expected_1 = 1;
pthread_create(&thread1, NULL, function, (void *)&expected_0);
pthread_create(&thread2, NULL, function, (void *)&expected_1);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
Но когда выполнить это показывает выход 0 и вешает
[email protected]:~$ gcc -pthread even_odd.c
[email protected]:~$ ./a.out
0
Может ли одна просьба указать мне, что происходит здесь?
Также была бы лучшая логика для выполнения этой задачи?
Чтение 'counter' вне блокировки мьютекса - это гонка данных, поэтому неопределенное поведение. –
Не только это, вы оставили ';' после 'while()', поэтому ваши потоки будут входить в бесконечный цикл, обращаясь к 'counter', без мьютекса. –
@Sunil см. Мой ответ, я понял, почему цикл по-прежнему бесконечен, но блокирует мьютекс, прежде чем внутренний цикл while() будет правильным. –