pthreads:如果我创建具有相同线程ID的线程会发生什么?

时间:2017-02-15 06:54:37

标签: pthreads

我通过这样做创建了2个具有相同线程ID的线程:

pthread_t pt;
int rc1, rc2, t1, t2;
t1 = 0;
t2 = 1;
rc1 = pthread_create(&pt, NULL, func(), (void*)&t1);
rc2 = pthread_create(&pt, NULL, func(), (void*)&t2);

func()只打印传递的参数

我发现输出可以是0,然后是11,然后是0。这里到底发生了什么?这种情况是否与使用两个pthread_t值不同?

2 个答案:

答案 0 :(得分:2)

  

我通过这样做创建了2个具有相同线程ID的线程:

不,你不是。那是不可能的。

pthread_create函数创建一个新线程(具有唯一ID),并将新线程的ID存储在作为第一个参数传递的pthread_t中。该参数是一个 out 参数,意味着您传入的pthread_t的值未被使用,会在调用完成后存储一个新值供您使用。

您正在做的是创建具有不同ID的两个线程,但是在创建第二个线程时,您将覆盖保存第一个ID的变量。

这意味着您只知道其中一个线程ID,但仍有两个不同的ID。

如果您不知道第一个线程的ID(因为您覆盖了存储该ID的变量),那么您无法加入,或将其分离,或向其发送信号。

答案 1 :(得分:1)

  

我发现输出可以是0然后是1或1然后是0中的任何一个。这里真的发生了什么?这种情况是否与使用两个pthread_t值不同?

它不会有任何区别。使用两个线程ID不会对执行顺序产生任何影响。

  

如果我创建具有相同线程ID的线程会发生什么?

如果您没有线程ID,则无法加入(使用pthread_join())或使用pthread_signal()发送信号(使用pthread_setschedparam),调度参数(使用pthread_getschedparam / ipconfig)等。除此之外,没关系。