2017-02-15 76 views
0

我做这个创建2个线程具有相同的线程ID:pthreads:如果我使用相同的线程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值不同吗?

+0

使用两个'pthread_t'对象的区别在于,在这种情况下,您无法使用第一个线程进行连接。 – EOF

回答

2

我做这个创建2个线程与相同线程ID:

不,你不是。这不可能。

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

你正在做的是用不同的ID创建两个线程,但是当第二个线程被创建时,你覆盖了保存第一个ID的变量。

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

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

1

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

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

如果我使用相同的线程ID创建线程,会发生什么情况?

如果不具有线程ID,那么你不能加入(使用pthread_join())与它或(使用pthread_signal())将信号发送到它,调整调度参数(使用pthread_setschedparam/pthread_getschedparam)等除此之外,没关系。

相关问题