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

Alb*_*ore 5 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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么停止这样的线程?一种方法是使用pthread_cancel,但我宁愿更优雅地做.还是喜欢pthread_kill什么?但是,在这种情况下,read方法是否会阻塞(正如我所假设的那样)以及线程如何处理信号?或者是应该处理它的过程?

我非常感谢你的建议!

bla*_*aze 6

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

尝试寻找它。以下是类似的讨论之一:关闭阻塞 UDP 套接字的正确方法


mah*_*mah 5

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

  • 是的,但是......不要.避免阻止像瘟疫这样的电话.使用阻止呼叫进行编码就像使用穿孔卡一样.它是面向批处理的. (2认同)