Изящно убить блокирующую нить в C-pthread? - PullRequest
5 голосов
/ 14 июня 2011

Допустим, у меня есть тема, похожая на эту:

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 возможно?В таком случае, однако, будет ли метод чтения разблокирован (как я полагаю, он должен) и как поток будет обрабатывать сигнал?Или это процесс, который должен с этим справиться?

Буду очень признателен за совет!

Ответы [ 3 ]

5 голосов
/ 14 июня 2011

Ответ на этот вопрос заключается в том, чтобы не делать ничего, что блокирует без тайм-аута.Для ввода-вывода не следует вызывать read (), пока вы не узнаете, что вызов не будет блокирован.Например, сначала используйте poll () или select () по пути, чтобы определить статус.

4 голосов
/ 14 июня 2011

Ваша проблема на самом деле "как прервать блокировку системного вызова из другого потока".

Попробуйте найти его.Вот одно из подобных обсуждений: Правильный способ закрыть блокирующий сокет UDP

0 голосов
/ 14 июня 2011

Нельзя изящно убить нить.Если вы хотите чистый выход, убедитесь, что поток завершается в зависимости от некоторых условий.

...