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

时间:2011-06-14 10:33:27

标签: 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 */
    }
}

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

我非常感谢你的建议!

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

尝试搜索它。以下是其中一个类似的讨论:Proper way to close a blocking UDP socket

答案 2 :(得分:0)

你不能优雅地杀死一个线程。如果要干净退出,请确保线程根据某些条件退出。