【发布时间】: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