P线程_Join()混合线程输出

js5cn81o  于 2022-10-23  发布在  Linux
关注(0)|答案(2)|浏览(210)

我研究了pthreadJoin(),我知道它会运行线程,直到线程处理完成,但在我的例子中,它不是这样工作的,我必须使用2个函数创建4个线程,我希望再次输出为fun1、fun2、fun1和fun2,因为我是按照这个序列调用线程的。以下是我的代码,可以更清楚地描述我的问题。


# include <stdio.h>

# include <stdlib.h>

# include <pthread.h>

void *thread1()
{
int c=0;
while(c++ < 10)
printf("%i : Hello!!\n",c);
}
void *thread2()
{
int c=0;
while(c++ < 10)
printf("%i : How Are You!!\n",c);
}
int main( int argc, char *argv[], char *env[] )
{
pthread_t tid1,tid2,tid3,tid4;
pthread_create(&tid1,NULL,thread1,NULL);
pthread_create(&tid2,NULL,thread2,NULL);
pthread_create(&tid3,NULL,thread1,NULL);
pthread_create(&tid4,NULL,thread2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
return 0;
}

每次输出变量,每次给出不同的输出,我不明白发生了什么。输出:
我所期待的是
有谁能描述一下这里发生的事情吗?谢谢!

juud5qan

juud5qan1#

  • 我希望输出再次为fun1、fun2、fun1和fun2,因为我正在按此序列调用线程。*

线程不会被排序--它们独立运行。如果希望以任何方式同步或排序不同的线程,则必须自己使用互斥、信号量、条件变量或其他显式同步方法进行编码。
在没有这种显式同步的情况下,您不能期望独立线程之间有任何特定的执行顺序。

7jmck4yq

7jmck4yq2#

因为线程以并行方式运行,所以它们彼此独立运行。如果希望它们按顺序排列,请使用以下方法:

pthread_create(&tid1,NULL,thread1,NULL);
    pthread_join(tid1,NULL);
    pthread_create(&tid2,NULL,thread2,NULL);
    pthread_join(tid2,NULL);
    pthread_create(&tid3,NULL,thread1,NULL);
    pthread_join(tid3,NULL);
    pthread_create(&tid4,NULL,thread2,NULL);
    pthread_join(tid4,NULL);

现在,当我们创建线程t1时,它将执行,pthreadJoin()将等待完成其执行。在线程t1完成其执行之后,现在我们正在创建另一个线程t2,现在它将运行。因此,通过这种方式,我们可以获得序列中的输出。

相关问题