我尝试创建3个线程来做事情,重复2次,我预期所有线程都会通过使用pthread_exit(NULL)
退出,但是看起来输出只显示一次,也许线程只创建了一次……
我对pthread_exit()
的用法感到困惑。
我可以用这个…把线弄坏吗。。。?
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sched.h>
#define gettid() syscall(__NR_gettid)
void *f1(void *a)
{
printf("f1\n");
return NULL;
}
void *f2(void *a)
{
printf("f2\n");
return NULL;
}
int main(int argc, char const *argv[])
{
/* code */
pthread_t t0,t1,t2;
int i ;
for ( i = 0 ; i < 2 ; i++)
{
if (pthread_create(&t0,NULL,&f1,NULL)== -1)
printf("error 1\n");
if (pthread_create(&t1,NULL,&f2,NULL)== -1)
printf("error 2\n");
if (pthread_create(&t2,NULL,&f1,NULL)== -1)
printf("error 1\n");
pthread_join(t0,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_exit(NULL);
}
return 0;
}
最佳答案
输出只显示一次,可能线程只创建了一次
代码在第一次迭代后调用pthread_exit()
for (i = 0 ; i < 2 ; i++)
{
...
pthread_exit(NULL);
}
因此,以cc表示的线程退出,不再进行迭代,因此每个调用到cc只执行一次。
要修复此问题,请将调用移到
main()
循环之后: for (i = 0 ; i < 2 ; i++)
{
...
}
pthread_exit(NULL);
我对pthRead Stutter()的用法感到困惑。
我可以用这个来破坏线,对吗。。?
main()
结束调用线程。分配给结束线程的资源将被释放,这取决于线程是分离的还是附加的,后者是默认的。
线程的资源被释放,对于处于状态的线程。。。
通过调用相关pthread-id上的
pthread_create()
来连接。在线程终止时分离,因此不需要调用
pthread_exit()
。要分离线程,请在要分离的线程的pthread id上使用
for
。另外,请注意,对于PThread API的最新实现,所有函数都返回一个错误代码
pthread_exit()
。所以你应该改变
if (pthread_create(&t0, NULL,&f1, NULL)== -1)
printf("error 1\n");
成为
if (0 != pthread_create(&t0, NULL,&f1, NULL))
{
printf("error 1\n");
}
或者更好
int result;
...
if (0 != (result = pthread_create(&t0, NULL, &f1, NULL)))
{
errno = result;
perror("pthread_create() failed");
}