【发布时间】:2020-03-08 20:29:36
【问题描述】:
我正在学习如何在 C 中使用线程,我创建了一个程序,它调用两个线程并同时打印一些东西。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
void *functionCount1();
void *functionCount2();
int count = 0;
#define COUNT_DONE 10
int main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &functionCount1, &count);
pthread_create( &thread2, NULL, &functionCount2, &count);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
printf("Final count: %d\n", count);
exit(0);
}
//Print count when count is even
void *functionCount1()
{
for(;;)
{
pthread_mutex_lock( &count_mutex );
pthread_cond_wait( &condition_var, &count_mutex );
count++;
printf("Counter value functionEven: %d\n",count);
pthread_mutex_unlock( &count_mutex );
}
}
//Print count when count is odd
void *functionCount2(void *arg)
{
for(;;)
{
pthread_mutex_lock( &count_mutex );
if(count%2 == 0)
{
pthread_cond_signal( &condition_var );
}
if(count % 2 != 0)
{
count++;
printf("Counter value functionOdd: %d\n",count);
}
pthread_mutex_unlock( &count_mutex );
if(count >= COUNT_DONE) return(NULL);
}
}
输出正确,但线程似乎仍在后台运行。如何解决该问题并正确终止线程?
【问题讨论】:
-
functionCount1函数没有退出。它将永远循环。在您的情况下,因为functionCount2完成了执行,所以卡在了条件变量上。在functionCount1中将for(;;)替换为while (count < COUNT_DONE)。 -
@TarekDakhran 感谢您的回复,我尝试将 for 循环替换为 while 循环,但仍然无法正常工作。
-
尝试
while (count + 1< COUNT_DONE),似乎边缘案例逻辑不正确。while (count < COUNT_DONE)也可以,但您必须再发出一次条件变量信号。 -
现在是正确的感谢您的帮助
-
我已经编辑了上面的评论。请重读。
标签: c linux operating-system