我试图实现一个生产者/消费者类型的东西,其中生产者线程抓取字符串中的字符,并将它们放入一个循环链表队列(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
不要忽视你的编译器的警告,不要试图用cast来杀死警告。 (有时,演员阵容是正确的,但更多的时候,这是错误的解决方案,正在被诊断的问题。)请记住,编译器比你更了解C语言。 –