仅使用一个pthread_t变量和多个pthread_t变量的区别是什么?

时间:2015-06-13 13:56:47

标签: c multithreading pthreads

我想知道使用不同数量的pthread_t变量的不同之处 这是我做的一个简单的代码:

#include <stdio.h>
#include <pthread.h>

void *thread(void *vargp);

int main(int argc, char **argv)
{
     pthread_t tid;

     for (int i = 0; i < 5; i++){
          int* a = malloc(sizeof(int));
          *a = i;
          pthread_create(&tid, NULL, thread, a);
     }

     if(pthread_join(tid, NULL) == -1){
          printf("error");
          exit(1);
     }
}

void *thread(void *vargp)
{
     int count = 1;
     for(int i = 0; i <3; i++){
          printf("count : %d, value : %d\n", count, (*(int *)vargp));
          count++;
     }
}

我的意思很好。但是,我认为奇怪的是它创建了5个线程,但只使用了一个pthread_t变量!我看到了一些例子,其中使用相同数量的pthread变量和它将创建的线程数。例如,如果我要创建如下所示的5个线程,我必须创建5个长度pthread_t数组,如pthread_t tid[5]。你能告诉我什么是差异吗?感谢

2 个答案:

答案 0 :(得分:1)

传递给pthread_t

pthread_create变量是一个线程标识符,可以根据需要重复使用。因此,使用相同的idenitfier tid创建多个线程的方式没有任何问题。但是你将失去所有其他线程的身份,除了使用它创建的最后一个线程,因为tid在循环中不断被覆盖。

但是,如果您希望从线程接收退出值(使用pthread_join)或者喜欢执行其他操作(例如使用pthread_detach) - 您可以创建一个线程在分离状态或线程本身可以分离它),设置/获取调度参数(使用pthread_setschedparampthread_getschedparam)等,从主线程你不能这样做,因为你没有线程的ID。

简而言之,代码非常好,如果你想操作来自外部的线程tid[5]) >(与线程内部相反 - 线程可以使用pthread_self()获取其ID。)

答案 1 :(得分:0)

让我们假设您要创建5个线程,然后在主线程上执行一些代码,然后在从主线程返回之前等待所有其他线程结束。 在这种情况下,您必须保留pthread_t以便将来在pthread_join中使用。