gpt4 book ai didi

c - for 循环中的 pthread_exit 困惑

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:59 24 4
gpt4 key购买 nike

我尝试创建 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;
}

最佳答案

the output only shows one time and maybe the threads only created one time

代码在 main() 的第一次迭代后调用 pthread_exit()

  for (i = 0 ; i < 2 ; i++)
{
...
pthread_exit(NULL);
}

所以由 main() 表示的线程退出并且没有进一步的迭代完成,所以每次调用 pthread_create() 只完成一次。

要解决此问题,请在 for 循环之后调用 pthread_exit() :

  for (i = 0 ; i < 2 ; i++)
{
...
}

pthread_exit(NULL);

I am confused of the usage of pthread_exit() .

Is it correct that I can destroy the thread by using this one..?

pthread_exit()结束调用线程。

分配给已结束线程的资源的释放取决于线程是分离还是附加,后者是默认值。

一个线程的资源被释放,对于一个处于状态的线程...

  • 通过调用 pthread_join() 附加基于相关的 pthread-id。
  • 分离 在线程终止时,因此不会调用 pthread_join()是必要的。

分离线程使用pthread_detach()在要分离的线程的 pthread-id 上。


另请注意,对于 PThread-API 的最新实现,所有函数都会返回错误代码 > 0

所以你应该改变

  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");
}

关于c - for 循环中的 pthread_exit 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com