c-使用共享变量并行运行2个线程
只是一个线程的初学者,我只是在做一个包含这两个线程的任务c-使用共享变量并行运行2个线程,c,multithreading,pthreads,volatile,C,Multithreading,Pthreads,Volatile,只是一个线程的初学者,我只是在做一个包含这两个线程的任务 #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("I
#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;
}
我的目标是并行运行这两个线程。现在,join似乎正在这样做;还是我哪里出了问题
我已经读到,对于C中的线程,使用volatile是不可取的。那么有没有任何方法可以使用count作为从线程2到1的信号呢?Quote:
我对pthread_join()的理解是,如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行,依此类推
这是不正确的。Join仅仅意味着进程等待线程终止
引述:
执行pthread_join(th1)的那一刻,两个线程都被创建并“并发”执行
这是不正确的。线程是在调用pthread\u create
时创建和启动的。注意:通过start我的意思是它们已经准备好执行了。然而,由操作系统决定何时真正开始执行,因此在执行之前可能需要一些时间
要在两个线程之间共享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);
例如:
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);
您在哪里读到“如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行”?Pthread_join只是等待作为参数提供的线程终止。是什么让你认为你的踏板是在调用pthread_join时创建的?您的线程是用pthread_create创建和启动的。需要保护对共享变量(
count
此处)的并发读/写访问。这通常是使用互斥锁完成的。请参阅这些函数上的pthread\u mutex_*()
函数。@alk,如果我在func2中锁定count,在func2解锁count之前,我的整个func1不会停止吗?或语句,直到func1中的“count”被执行并等待func2解除锁定?那么这就意味着没有并发,对吗?如果有任何答案解决了您的问题,请单击大复选框接受它作为答案。这将向社区表明您找到了一个解决方案,并将给您和回答者带来一些声誉。我知道线程从我们执行“pthread_create”的那一刻开始执行。这是否意味着并行执行?当我尝试不使用“pthread_join”时,我的线程2甚至没有启动。为什么?@infoseeker-是的,同样如此。但并行的含义可能因系统而异。简单的单核CPU只使用分时,而多核CPU可以真正并行运行线程。@Infoseek引用:如果没有“pthread_join”,我的线程2甚至不会启动。为什么?
如果没有关于您系统的详细信息,我无法知道。猜测可能是main
在threads
实际执行之前完成。在任何情况下,都需要join,因为您需要等待线程运行terminate@infoseeker:只需通过调用pthread\u exit()
离开main()
。这和另一条线差不多。如果main()
以简单的return
ing结束,那么整个过程将与其所有线程一起结束。后者在您看来似乎线程甚至都没有启动。您可能想指出,仅仅定义一个互斥变量(如代码段所示)是不够的。它需要事先进行初始化。