只是线程的初学者,我只是在做一个涉及这2个线程的任务。
#include <stdio.h>
#include <pthread.h>
int count = 0;
void waitFor(unsigned int secs)
{
unsigned int retTime = time(0) + secs;
while(time(0) < retTime);
}
void func1(void * args)
{
printf("In func1 ...\n");
long i = 0;
while(1){
i++;
if(count == 1)
break;
}
printf("The total number counted is: %ld \n", i);
count = 0;
i = 0;
}
void func2(void * args)
{
printf("In func2 ...\n");
waitFor(3);
count = 1;
}
int main()
{
pthread_t th1, th2;
int j = 0;
while(j++ < 4){
printf("\nRound:\t%d\n", j);
pthread_create(&th1, NULL, (void*)func1,NULL);
pthread_create(&th2, NULL, (void*)func2, NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
waitFor(3);
}
return 0;
}
我已经读过各种引用并且我的理解pthread_join()意味着如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行,依此类推。
但是当我运行这个程序时,执行pthread_join(th1)的那一刻,两个线程都被同时创建并执行了#39;这是怎么回事? 输出:
Round: 1
In func2 ...
In func1 ...
The total number counted is: 897651254
Round: 2
In func1 ...
In func2 ...
The total number counted is: 1051386065
........
我的目标是并行运行这两个线程。现在,加入似乎是这样做的;或者我在某个地方出错?
我已经读过使用volatile不适合C中的线程。那么有什么方法可以将count用作线程2到1的信号吗?
答案 0 :(得分:2)
引用:
我的理解pthread_join()意味着如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行,依此类推
这是不正确的。加入只是意味着进程等待线程终止。
引用:
执行pthread_join(th1)时,两个线程都会同时创建和执行。
这是不正确的。线程已创建并在调用pthread_create
时启动注意:通过开始,我的意思是它们已准备好执行。但是,操作系统决定它们何时实际执行,因此执行它们可能需要一些时间。
要在两个线程之间共享count
,您可以使用互斥锁。
int count = 0;
pthread_mutex_t lock;
访问count
时,必须首先锁定互斥锁,读取/写入变量并解锁互斥锁。
示例:
pthread_mutex_lock(&lock);
count = 1;
pthread_mutex_unlock(&lock);
示例:
pthread_mutex_lock(&lock);
if(count == 1)
{
pthread_mutex_unlock(&lock);
break;
}
pthread_mutex_unlock(&lock);
在main
中,您需要初始化互斥锁,如:
pthread_mutex_init(&lock,NULL);