Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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 如何取消子POSIX线程_C_Linux_Multithreading_Pthreads - Fatal编程技术网

C 如何取消子POSIX线程

C 如何取消子POSIX线程,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,等待3秒钟后,主线程发出命令pthread_cancel停止子线程,并且在调用命令pthread_join后,子线程真正开始响应取消 此时,主线程在pthread_join之后立即运行到该行,子线程在以下代码的循环中运行 $ ./threadA thread_function is running Thread is still running (0)... Thread is still running (1)... Thread is still running (2)... Canceli

等待3秒钟后,主线程发出命令pthread_cancel停止子线程,并且在调用命令pthread_join后,子线程真正开始响应取消

此时,主线程在pthread_join之后立即运行到该行,子线程在以下代码的循环中运行

$ ./threadA
thread_function is running
Thread is still running (0)...
Thread is still running (1)...
Thread is still running (2)...
Canceling thread...
Waiting for thread to finish...
$
(i=0;i<10;i++)的
{
printf(“线程仍在运行(%d)…\n”,i);
睡眠(1);
}
我在这个循环中没有看到任何check语句,但是主线程仍然可以取消 孩子们的线。我假设POSIX多线程系统内部有一个检查系统,以便在主线程中调用pthread_join时可以终止子线程

问题>

基本上,我需要了解如何在循环中取消子线程,而不检查任何标志


此外,如果有任何错误,请更正我的描述。

请先阅读手册页。这解释了很多。特别是对于您的问题,循环中不应有检查语句。我还没有检查Linux实现,但合理的做法是向线程发送一个信号,请求线程停止/取消。如果在信号处理程序线程被确定为无法取消的状态,则请求将排队。一旦您调用了一个新状态的函数,并且新状态被确定为可取消,那么将检查该队列,如果在队列中找到取消请求,则线程将被取消。基本上,不可取消的状态是一种。在您的情况下,当调用
sleep()
时,所有线程都将被取消,因为这是一个取消点。请参阅。

发生的情况是,您的循环至少包含一个取消点,
sleep
(可能还有两个,因为
printf
是可选的取消点)

作为取消点意味着函数包含类似于以下内容的逻辑:

    for(i = 0; i < 10; i++) {
        printf("Thread is still running (%d)...\n", i);
        sleep(1);
    }
然而,在现实中,这有点复杂,因为如果取消请求在函数“等待”或“阻止”某个事件发生时到达(如睡眠时间到期,或来自套接字的输入),则必须对其进行操作。因此,需要某种异步传递机制,典型的实现是使用信号,但实际上很难做到正确,而且流行的实现做得并不好。对于glibc中一些其他实现可能共享的丑陋角落案例,请参阅以下错误报告:


在您的情况下,几乎肯定发生的是,当线程在<代码>睡眠> />代码中等待时,取消请求(通过一个信号)到达,并且信号处理程序运行,确定它处于可取消操作的中间,并对取消请求执行操作。

pthread\u setcanceltype
pthread\u setcancelstate
不是取消点。取消状态仅在取消点检查,除非取消类型为异步,在这种情况下,可以在其他点和中断代码异步检查取消状态(但不需要)。
    for(i = 0; i < 10; i++) {
        printf("Thread is still running (%d)...\n", i);
        sleep(1);
    }
if (thread_local_cancellation_flag) {
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE);
    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED);
    pthread_exit(PTHREAD_CANCELED);
}