我通过这样做创建了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
,然后是1
或1
,然后是0
。这里到底发生了什么?这种情况是否与使用两个pthread_t
值不同?
答案 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
)等。除此之外,没关系。