【问题标题】:pthread_join() mixing threads outputspthread_join() 混合线程输出
【发布时间】:2017-03-24 16:36:17
【问题描述】:

我研究了 pthread_join() 我知道它运行线程直到线程处理完成,但在我的情况下它不是这样工作的,我必须使用 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;
}

输出每次变化,每次输出不同,我不明白发生了什么。 输出:

1 : Hello!!
2 : Hello!!
3 : Hello!!
4 : Hello!!
5 : Hello!!
6 : Hello!!
7 : Hello!!
1 : How Are You!!
1 : How Are You!!
2 : How Are You!!
3 : How Are You!!
4 : How Are You!!
8 : Hello!!
9 : Hello!!
10 : Hello!!
2 : How Are You!!
3 : How Are You!!
4 : How Are You!!
5 : How Are You!!
6 : How Are You!!
7 : How Are You!!
8 : How Are You!!
9 : How Are You!!
10 : How Are You!!
5 : How Are You!!
6 : How Are You!!
7 : How Are You!!
8 : How Are You!!
9 : How Are You!!
10 : How Are You!!
1 : Hello!!
2 : Hello!!
3 : Hello!!
4 : Hello!!
5 : Hello!!
6 : Hello!!
7 : Hello!!
8 : Hello!!
9 : Hello!!
10 : Hello!!

我所期待的

1 : Hello!!
2 : Hello!!
3 : Hello!!
4 : Hello!!
5 : Hello!!
6 : Hello!!
7 : Hello!!
8 : Hello!!
9 : Hello!!
10 : Hello!!
1 : How Are You!!
2 : How Are You!!
3 : How Are You!!
4 : How Are You!!
5 : How Are You!!
6 : How Are You!!
7 : How Are You!!
8 : How Are You!!
9 : How Are You!!
10 : How Are You!!
1 : Hello!!
2 : Hello!!
3 : Hello!!
4 : Hello!!
5 : Hello!!
6 : Hello!!
7 : Hello!!
8 : Hello!!
9 : Hello!!
10 : Hello!!
1 : How Are You!!
2 : How Are You!!
3 : How Are You!!
4 : How Are You!!
5 : How Are You!!
6 : How Are You!!
7 : How Are You!!
8 : How Are You!!
9 : How Are You!!
10 : How Are You!!

谁能描述这里发生了什么? 谢谢!

【问题讨论】:

  • 请注意,pthread_join(t, NULL) 不会对线程t 做任何事情。它不会“在线程处理完成之前运行线程”,它不会通知线程您正在尝试加入它。它所做的只是等待线程完成它的工作。

标签: c linux multithreading pthreads


【解决方案1】:

我期待输出再次为 fun1、fun2、fun1 和 fun2,因为我正在按此顺序调用线程。

线程没有排序 - 它们独立运行。如果您希望不同的线程以任何方式同步或排序,您必须使用互斥锁、信号量、条件变量或其他一些显式同步方法自己编写代码。

如果没有这种显式同步,您不能期望在单独的线程之间有任何特定的执行顺序。

【讨论】:

  • 所以 pthread_join();只负责执行一个线程,不负责它的终止?
  • @MohammadTayyab pthread_join() 不执行线程——它只是停止调用pthread_join() 的线程,等待与传递给pthread_join() 的线程ID 匹配的线程完成执行。如果该线程运行很长时间,pthread_join() 调用将等待很长时间。如果匹配的线程已经执行完毕,pthread_join()会立即返回。
  • 好的! @Andrew Henle 所以我的输出是完全正常的。没有任何错误 ?对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多