- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在正在维护一些代码,它使用 pthread_create()
创建一个 pthread。此线程还在创建后不久调用 pthread_detach(pthread_self());
。此外,它使用 pthread_cleanup_push()
来推送清理处理程序。此线程的唯一取消点是在线程主循环结束时调用 pthread_testcancel()
。
我现在明白了,在某个时刻 pthread_cancel()
在此线程上被调用并且(几乎)总是返回一个非零值。检查 errno 结果为 EINPROGRESS
。这到底是什么意思?因为手册页指出
On success, pthread_cancel() returns 0
但是,它也提到,
that cancellation will be delayed until the thread next calls a function that is a cancellation point.
因此,如果返回值非零且 errno 等于 EINPROGRESS
意味着取消请求已排队,但尚未作出 react ,我希望情况总是如此。但如果返回值为 0 表示成功,那么它一定意味着不同的东西。
在这种情况下,EINPROGRESS
是什么意思?我如何确定线程已正确取消或已终止?
我在 VM 中运行带有 libpthread-2.13 作为 libc6:amd64 2.13-38+deb7u1 一部分的 Debian 7.4。
最佳答案
I now see, that at some point pthread_cancel() gets called on this thread and (almost) always returns a nonzero value. Checking errno results in EINPROGRESS.
pthread*
函数族不设置errno
,而是将错误代码作为函数值返回。
因此,不仅要针对 0
测试调用 pthread_cancel()
的结果,还要实际将返回值解释为您“正常”在 中找到的值>errno
,这是 E*
错误值之一。
int result = pthread_cancel(<some-pthread>);
if (0 != result)
{
fprintf(stderr, "pthread_cancel() failed with error #%d: '%s'\n", result, strerror(result)); /* Better use strerror_r() in a multithreaded enviroment. */
}
顺便说一句:检查您似乎正在使用的 libc 的源代码不会显示任何 pthread_cancel()
返回 EINPROGRESS
的提示。
关于c - pthread_cancel 返回 EINPROGRESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23225449/
socket() 函数是否可能在 Linux 中因 EINPROGRESS 而失败?请注意,我特别询问的是 socket(),而不是 connect() 或其他。 POSIX没有将 EINPROGRE
我现在正在维护一些代码,它使用 pthread_create() 创建一个 pthread。此线程还在创建后不久调用 pthread_detach(pthread_self());。此外,它使用 pt
在 Solaris 中出现套接字错误 EINPROGRESS 的可能原因是什么?我们如何检查根本原因? tcp api 是:连接 最佳答案 你有一个非阻塞套接字,你正在其中调用 connect()。由
如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误?我可以从服务器做什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等) 最佳答案 当连接到本地主机时,TCP
更新: 我的错。我得到的错误是 ECONNREFUSED 而不是 EINPROGRESS。在检查了 error 变量后,我发现它大于 0,我打印了 errno 而不是 error。当然 errno 是
我是一名优秀的程序员,十分优秀!