我想知道调用pthread_cancel()
终止线程是否安全.我在手册页中找不到任何提示.提前感谢任何提示.
编辑:也许我不够准确.我不是在讨论由早期的pthread_cancel()终止的线程,而是关于只是从它们的线程函数返回的线程.
cni*_*tar 10
我认为它需要安全,否则pthread_cancel
会出现问题(旁边无法使用).
实际上,如果它不安全,pthread_cancel
通过检查线程是否存活(并确保它保持活着直到你取消它),每次调用都必须非常复杂.一个简单的"你还在那里"是不行的.
总之,如果线程终止,我相信pthread_cancel
必须是安全的.当然,对于已终止且已连接的线程,情况可能并非如此.
错误最高
Run Code Online (Sandbox Code Playgroud)ESRCH No thread with the ID thread could be found.
ESRCH
线程没有在进程中指定当前正在运行的线程.
如果实现在生命周期结束后检测到使用了线程ID,则建议该函数失败并报告[ESRCH]错误.
UPDATE
在NPTL中,有一个双重取消检查或退出后取消:
/* We are canceled now. When canceled by another thread this flag
is already set but if the signal is directly send (internally or
from another process) is has to be done here. */
int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
if (oldval == newval || (oldval & EXITING_BITMASK) != 0)
/* Already canceled or exiting. */
break;
Run Code Online (Sandbox Code Playgroud)
因此,退出后的第二次取消或取消将是死线的noop.
exiting_bitmask由__do_cancel设置:
/* Called when a thread reacts on a cancellation request. */
static inline void
__attribute ((noreturn, always_inline))
__do_cancel (void)
{
struct pthread *self = THREAD_SELF;
/* Make sure we get no more cancellations. */
THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT);
Run Code Online (Sandbox Code Playgroud)
__do_cancel既是对异步取消的反应,也是对pthread_exit的反应
void
__pthread_exit (value)
void *value;
{
THREAD_SETMEM (THREAD_SELF, result, value);
__do_cancel ();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5174 次 |
最近记录: |