Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthread\u取消返回EINPROGRESS_C_Multithreading_Pthreads_Posix_Cancellation - Fatal编程技术网

C pthread\u取消返回EINPROGRESS

C pthread\u取消返回EINPROGRESS,c,multithreading,pthreads,posix,cancellation,C,Multithreading,Pthreads,Posix,Cancellation,我现在正在维护一些代码,它使用pthread\u create()创建一个pthread。该线程还调用pthread_detach(pthread_self())创建后不久。此外,它还使用pthread\u cleanup\u push()来推送清理处理程序。此线程的唯一取消点是在线程主循环的末尾调用pthread\u testcancel() 我现在看到,在某个点上,在这个线程上调用pthread\u cancel(),并且(几乎)总是返回一个非零值。在EINPROGRESS中检查errno结

我现在正在维护一些代码,它使用
pthread\u create()
创建一个pthread。该线程还调用
pthread_detach(pthread_self())创建后不久。此外,它还使用
pthread\u cleanup\u push()
来推送清理处理程序。此线程的唯一取消点是在线程主循环的末尾调用
pthread\u testcancel()

我现在看到,在某个点上,在这个线程上调用
pthread\u cancel()
,并且(几乎)总是返回一个非零值。在
EINPROGRESS
中检查errno结果。这到底意味着什么?因为手册上说

成功时,pthread_cancel()返回0

但是它也提到,

该取消将被延迟,直到线程下一次调用作为取消点的函数为止

EINPROGRESS:
因此,如果返回值为非零且errno等于
EINPROGRESS
意味着取消请求已排队,但尚未响应,我希望情况始终如此。但是如果返回值为0表示成功,那么它一定意味着不同的东西

在这种情况下,
EINPROGRESS
意味着什么?我如何确保线程被正确取消或已经终止



我正在虚拟机中运行带有libpthread-2.13的Debian 7.4,作为libc6:amd64 2.13-38+deb7u1的一部分。可以启用(新线程的默认设置)或禁用由pthread_setcancelstate(3)确定的线程可取消状态。如果线程已禁用取消,则取消请求将保持排队状态,直到该线程启用取消。如果线程已启用取消,则其可取消性类型将确定取消发生的时间

-
由pthread_setcanceltype(3)确定的线程取消类型可以是异步的,也可以是延迟的(新线程的默认值)。异步可取消性意味着线程可以随时取消(通常是立即取消,但系统不保证这一点)。延迟可取消性意味着取消将被延迟,直到线程下一次调用作为取消点的函数为止

EINPROGRESS:
在选择了非阻塞模式的对象上启动了无法立即完成的操作。某些必须始终阻塞的函数(如connect)永远不会返回EAGAIN;相反,它们返回EINPROGRESS以指示操作已经开始,并且需要一些时间。在调用完成之前尝试操作对象返回EALREADY

...how can I make sure, that the thread got canceled correctly 
or was already terminated?
您可以使用select函数确定挂起的操作何时完成

我现在看到,在某个时刻,pthread_cancel()在这个线程上被调用,并且(几乎)总是返回一个非零值。在EINPROGRESS中检查errno结果

pthread*
函数族不设置
errno
,而是将错误代码作为函数值返回

因此,不仅要根据
0
测试调用
pthread\u 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. */
}
int result=pthread_cancel();
如果(0!=结果)
{
fprintf(stderr,“pthread_cancel()”失败,错误为#%d:“%s'\n”,result,strerror(result))/*最好在多线程环境中使用strerror_r()*/
}

顺便说一句:检查您似乎正在使用的libc的源代码并没有显示任何关于
pthread_cancel()
返回
EINPROGRESS

的提示,您在哪个平台上,使用哪个版本/实现的PThreads观察到这种行为?谢谢您的评论,我更新了我的问题您在取消呼叫后立即检查errno,并且仅当返回代码为非零时?EINPROGRESS不是一个有效的错误,假设pthread_cancel作为一个信号实现,那么就没有真正的进度需要监控。是的,代码就是这样做的。对不起,我的问题有误,我说EINPROGRESS已经返回。事实上,返回一个非零值,errno设置为EINPROGRESS。您的意思是,对于延迟的canceltype或禁用的cancelstate,pthread_cancel()返回非零值且errno等于EINPROGRESS是完全正确的吗?实际上这是有道理的,尽管我觉得手册页有点误导。你能解释一下如何使用select()等待分离的pthread的终止吗?谢谢你指出这一点。我认为现有代码是理所当然的,忽略了pthread_cancel确实没有设置errno。我必须检查实际返回代码…好的,实际返回值告诉我“没有这样的过程”是由其他问题引起的。接受这个答案,因为它让我找到了问题的真正原因,并指出了代码中的另一个错误。