LINUX.ORG.RU

Управление потоком


0

0

Хотелось бы услышать совет, как эффективно и переносимо (между юниксами)остановить поток, который ожидает поступления данных на каком-нибудь дескрипторе, например, на сокете. Единственное, что приходит в голову - сигналы, но отсылка сигналов потокам зависит от реализации (posix threads, nptl, что-то другое). В posix threads каждый поток имеет свой pid, а значит сигнал будет послан именно этому потоку, не затронув остальных, как в nptl я увы не знаю. Может есть какой-то ещё способ?

anonymous

внимательно читайте доки по POSIX Threads. по делу - вы можете сделать ему pthread_cancel(). Все известные мне ф-ии, где такое ожидание возможно есть cancellation points согласно стандарту POSIX - переносимее просто некуда.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, но pthread_cancel() отменяет именно posix потоки, а как быть с nptl или эта возможность остаётся в силе?

Может есть способ передачи сокету каких-то параметров, или параметров файловому дескриптору, чтобы можно было прервать ожидание системного вызова, хотя опять-таки только сигналы...

anonymous
()
Ответ на: комментарий от anonymous

если бы вы уделили малую толику своего времени прочтению документации то, вероятно, вы бы заметили что NPTL - это аббревиатура долженствующая обозначать библиотеки соответствующие Native POSIX Thread Model .

anonymous
()
Ответ на: комментарий от anonymous

Да, вероятно вы правы. Почему я сам не догадался:-) И тем не менее может есть какой-то ещё способ? Не нравится мне отмена потока...

anonymous
()
Ответ на: комментарий от anonymous

К сожалению переносимого и стандартного способа больше нет. Есть черное шаманство, основанное на конкретных реализациях pthreads/kernel (имеется в виду не только linux|FreeBSD|Solaris kernels)

anonymous
()
Ответ на: комментарий от anonymous

>Да, вероятно вы правы. Почему я сам не догадался:-) И тем не менее может есть какой-то ещё способ? Не нравится мне отмена потока...

На мой взгляд отмена потоков не самый крапсивый способ которым стоит пользоваться.
У вас в дизайнк программы должен быть предусмотрен какой то свой способ завершения потока.
Или у вас программа которая никогда корректно не завершается? :-)

andron01
()
Ответ на: комментарий от anonymous

BTW, "В posix threads каждый поток имеет свой pid" вовсе не верно.

Верное обратное: стандарт POSIX указывает, что все потоки одного процесса имеют один и тот же PID". В LinuxThreads (с чем вы, вероятно, и путаете) - да, у каждого потока свой PID. И это -- не по стандарту.

jek_
()

Остановить поток - это не завершить я правильно понял ?
Есть условные переменные (сигнальные переменные),
их используют с блокировками
pthread_cond_init(), pthread_cond_destroy(),
pthread_cond_wait(), pthread_cond_signal()
С помощью этих блокировок вроде можно "усыпить"
поток, "пробудить". 

Если интересно можно посмотреть тему чуть ниже,
"блокировка сигнала ?",
там есть про потоки, сигналы, блокировки.

anonymous
()
Ответ на: комментарий от anonymous

Попробую привести более конкретный пример. Допустим поток ожидает прибытия данных на сокете (вызов read, или connect), мне нужно прервать ожидание с корректным завершением потока.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.