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

07-26 08:58