Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的阻塞线程?_C_Multithreading_Pthreads_Blocking - Fatal编程技术网

优雅地杀死C的pthread中的阻塞线程?

优雅地杀死C的pthread中的阻塞线程?,c,multithreading,pthreads,blocking,C,Multithreading,Pthreads,Blocking,假设我有一条这样的线: void my_thread(char *device_name) { int fd = open(device_name, O_RDONLY); struct input_event ev; while(1) { read(fd, &ev, sizeof(struct input_event)); /* do something */ } } 我怎样才能阻止这样一条线?一种方法是使用pthrea

假设我有一条这样的线:

void my_thread(char *device_name) {
    int fd = open(device_name, O_RDONLY);
    struct input_event ev;

    while(1) {
        read(fd, &ev, sizeof(struct input_event));
        /* do something */
    }
}
我怎样才能阻止这样一条线?一种方法是使用pthread_cancel,但我宁愿更优雅地使用它。像pthread_kill之类的东西?然而,在这种情况下,read方法会像我想象的那样解除阻塞吗?线程将如何处理该信号?还是应该由过程来处理


我非常感谢你的建议

答案是不要做任何会在没有超时的情况下阻塞的事情。对于IO,在知道调用不会阻塞之前,不应调用read。例如,首先在路径上使用poll或select来确定状态。

您无法优雅地终止线程。如果您希望干净地退出,请确保线程基于某些条件退出。

您的问题实际上是如何中断来自其他线程的阻塞系统调用


尝试搜索它。下面是一个类似的讨论:

但这并不能真正回答问题。如果你有一个超时很长的阻塞呼叫怎么办?是的,但是。。。不要。避免像瘟疫一样阻塞呼叫。使用阻塞调用进行编码就像使用穿孔卡一样。它是面向批处理的。@Oli-它确实回答了一个问题:不要这样做。如果你在内核中阻塞,你不能终止你的线程,除非通过你被阻塞的内核代码。发送一个信号可能会解除您的阻塞,也可能不会,这取决于在内核代码中,哪个信号和SIGKILL不能保证是特殊的。因此,套用电影《战争游戏》的话来说,取胜的唯一方法就是不玩。@mah:也许我错过了什么!让我们假设我们有一个工作线程来处理,例如网络I/O。您建议如何让这个线程在没有某种阻塞机制的情况下空闲等待输入?确定后,在超时期间或输入准备就绪之前,也选择blocks。@mah:setsockoptSO_RCVTIMEO在一段时间内未收到数据时返回recv。与select相同,但不包含select。在您的示例中,添加whilebExitThread,其中bExitThread是可从另一个线程更改的易失性变量。这是显而易见的。我对阻塞读取函数感到不安。如果他在一个读取调用中被阻塞,而这个读取调用很长一段时间都不会解除阻塞,那么他将很难读取该条件变量。你所说的是正确的,但首先要避免无法控制的阻塞。试着使用IO完成端口或类似的东西?只要泄漏线程,如果它将退出在正常的时间量无论如何?如果没有更多关于架构的信息,很难说。你能设计你的应用程序,这样就没有必要杀死这些线程吗?这回避了杀死它的问题。在应用程序退出并且操作系统销毁所有线程之前,你能不能不处理这个线程?如果设备已死机,那么您对此无能为力:从另一个线程关闭套接字句柄在Windows上正常工作-解锁呼叫。从另一个线程关闭套接字句柄在Linux上正常工作-取消阻止调用。在UDP套接字上的阻塞调用的特定情况下,如在链接中,将UDP消息发送到本地端口以说服调用返回有什么错?如果你不介意的话,可以使用UDP来完成:保持UDP套接字未绑定,否则你不能发送到它;b在停机期间创建新插座;c丢失与解除阻止数据包同时出现的真实数据包:无法保证区分读数据包和假数据包。至于工作正常-当FreeBSD升级破坏了我的应用程序时,这对我来说是一个相当令人讨厌的惊喜,因为close在之前工作正常,之后却永远卡住了。