【发布时间】:2014-06-07 04:09:58
【问题描述】:
我现在正在维护一些代码,它使用pthread_create() 创建一个 pthread。该线程还在创建后不久调用pthread_detach(pthread_self());。此外,它使用pthread_cleanup_push() 推送清理处理程序。该线程唯一的取消点是在线程主循环结束时调用pthread_testcancel()。
我现在看到,在某些时候pthread_cancel() 被此线程调用并且(几乎)总是返回一个非零值。在EINPROGRESS 中检查errno 结果。这到底是什么意思?因为手册页声明
成功时,pthread_cancel() 返回 0
不过,它也提到,
该取消将被延迟,直到线程下一次调用作为取消点的函数。
因此,如果返回值非零且 errno 等于 EINPROGRESS 意味着取消请求已排队,但尚未做出反应,我希望情况总是如此。但是如果返回值 0 表示成功,那么它一定意味着不同的东西。
EINPROGRESS 在这种情况下是什么意思,我如何确保线程被正确取消或已经终止?
我在 VM 中运行带有 libpthread-2.13 的 Debian 7.4 作为 libc6:amd64 2.13-38+deb7u1 的一部分。
【问题讨论】:
-
您在哪个平台、使用哪个版本/实现的 PThreads 观察到这种行为?
-
感谢您的评论,我更新了我的问题
-
您在取消调用后立即检查 errno 并且仅当返回码为非零时? EINPROGRESS 不是一个有效的错误,假设 pthread_cancel 是作为一个信号实现的,没有真正的进度需要监控。
-
是的,这就是代码的作用。抱歉,我的问题是错误的,我说 EINPROGRESS 已返回。实际上返回一个非零值,并且将 errno 设置为 EINPROGRESS。
标签: c multithreading pthreads posix cancellation