Я пытаюсь реализовать объект производителя/потребителя, когда поток производителя захватывает символы из строки и помещает их в очередь с круговым связанным списком (5 узлов большие) и потребительский поток считывает символы и выводит их на экран. Оба потока останавливаются, когда они достигают нового символа линии. Проблема, с которой я сталкиваюсь, заключается в том, что потребительский поток никогда не запускается до тех пор, пока продюсерский поток не завершится.Второй поток не запускается до тех пор, пока не будет завершен первый этап
int consumer_thread_alive;
...
void * producer(struct Node * head)
{
while (consumer_thread_alive == 0)
{
printf("Waiting on consumer.");
}
...
}
void * consumer(struct Node * head)
{
consumer_thread_alive = 1;
...
}
...
int main(int argc, char *argv[])
{
...
consumer_thread_alive = 0;
pthread_t produce;
pthread_t consume;
printf("Creating producer thread.\n");
pthread_create(&produce, NULL, (void *) producer(&head), NULL);
printf("Creating consumer thread.\n");
pthread_create(&consume, NULL, (void *) consumer(&head), NULL);
pthread_join(produce,NULL);
pthread_join(consume,NULL);
return 1;
}
Я вырезал некоторые из других частей, но то, где у меня возникают проблемы (глава инициализируется ранее в основном). Если я запустил код, так как он печатает «Создание потока производителей». а затем постоянно печатает «Ожидание потребителя». пока я не нажму Ctrl + C и остановите его. Кроме того, если я удаляю цикл в верхней части потока производителя, он запускает все его итерации, а затем вызывается потребительский поток. По какой-то причине он работает последовательно, а не параллельно.
Вы не можете синхронизировать потоки с простой переменной 'int'. Вы должны использовать правильные примитивы синхронизации. –
Вызов 'pthread_create()' неправильный. – alk
Не игнорируйте предупреждения своего компилятора и не просто пытайтесь убить предупреждения с помощью бросков. (Иногда приведение является правильным, но чаще всего это неправильное решение проблемы, которая диагностируется.) Помните, что компилятор знает больше о C, чем вы. –