2011-03-29 67 views

回答

3

如果pthread_join()的两个预期参数中的第一个为NULL,则在运行时可能发生任何错误。根据www.opengroup.org上的规范:“如果pthread_join()的线程参数指定的值没有引用可连接线程,则行为未定义。”

NULL接受pthread_join()的第二个参数。

编辑:确实有些实现可以指定行为。在你的系统上检查手册页上的pthread_join。

+0

一些实现定义了这种行为,例如Linux手册页声称,如果thread_id不对应一个线程,它会立即返回'errno'设置为'ESRCH'(尽管对我来说它传递NULL时简单地崩溃) – Cubbi 2011-03-29 14:44:41

+0

@Cubbi:一个有效的观察;谢谢! - 但听起来在实践中它仍然可以是UB? – 2011-03-29 14:49:53

+0

不断地引用规范,但不能告诉man第一个参数是一个无符号的long值,而不是一个指针。 /usr/include/bits/pthreadtypes.h:typedef unsigned long int pthread_t;函数签名:int pthread_join(pthread_t thread,void ** value_ptr); – user237419 2011-03-29 14:57:57

9

你得到一个编译时错误; pthread_join()预计2个参数:)

+0

+1真的! hahah – karlphillip 2011-03-29 14:37:43

+0

:P:P XXXXXXXXXX – user237419 2011-03-29 14:38:12

+0

假设我用NULL,NULL来调用它 - 会好吗? (或者它是否正在等待非NULL pthread?) – Zach 2011-03-29 14:38:18

0

理想情况下,你会经常检查函数返回

if (0 != pthread_join(thread, &result)) 
{ 
    fprintf(stderr, "pthread_join error\n"); 
} 

如果成功,在pthread_join()函数返回零。否则,将返回一个错误编号以指示错误。

+0

无论你试图传递给函数,检查返回,你都会知道发生了什么! – karlphillip 2011-03-29 14:39:19

+1

是的,如果你曾经去检查:) – user237419 2011-03-29 14:48:15