быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
|
1 | |
Как узнать, что поток закончился (библиотека pthread)?07.02.2012, 16:25. Просмотров 8186. Ответов 28
Метки нет Все метки)
(
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает- да, созданный ранее поток Y закончился?
Так-то можно в принципе сделать так: передавать в функцию потока Y параметром указатель на какой-нибудь флаг, и если поток Y заканчивается корректно, то он бы этот флаг, допустим обнулял. А потом проверять значение этого флага и по его значению определять- поток Y существует или нет. Но хотелсь бы попроще как-нибудь с помощьюю pthread-функции ккой-нибудь, если таковые есть. Спасибо, кто откликнется.
0
|
|
07.02.2012, 16:25 | |
как узнать закончился ли АП PR? Как узнать, что поток не завершен Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) библиотека pthread.h в Code::Blocks |
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 16:45 | 2 |
pthread_join
0
|
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
|
07.02.2012, 17:01 [ТС] | 3 |
Нет, не то. Дело в том, что pthread_join приостанавливает вызывающий поток до тех пор, пока запрашиваемый поток не закончится. Всё нормально, но именно приостанавливание меня и не устраивает.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 17:07 | 4 |
то есть надо просто как то сигналить?
тогда есть еще pthread_sigqueue , но это GNU расширение. или писать свое Добавлено через 1 минуту ну или топорно: даешь мьютекс, блокируешь в потоке(в самом начале, а перед концом - освобождаешь), try_lock в мэйне
0
|
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
|
|
07.02.2012, 17:20 | 5 |
Используй pthread_kill() с нулём в параметре сигнала.
0
|
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
||||||
07.02.2012, 19:44 [ТС] | 6 | |||||
0
|
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
|
||||||
07.02.2012, 20:15 | 7 | |||||
не стоит, тред умирает далеко не мгновенно. Попробуй вставить слип после pthread_cancel(), а лучше вообще озаботься нормальной синхронизацией
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 20:20 | 8 |
выдает ESRCH, если поток не существует.
поток будет существовать после его завершения( в роли потока-"зомби"), иначе бы вызов pthread_join так же бы возвращал ESRCH. поэтому не годится для проверки завершения потока. она (с со значением сигнала 0) проверяет запускался ли вообще поток с таким id
0
|
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
|
07.02.2012, 20:24 [ТС] | 9 |
Да я всяко и везде писал и 5 и 10 и 20 секунд, это же демонстрация, пример должен быть коротким. Короче, всё плохо.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 20:28 | 10 |
да хоть миллион. pthread_kill всегда возвратит 0, если поток Threadld успешно создавался и не было вызова pthread_join до вызова pthread_kill
0
|
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
|
|
07.02.2012, 20:29 | 11 |
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 20:31 | 12 |
0
|
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
|
07.02.2012, 20:37 [ТС] | 13 |
Мне посто надо узнать, поток есть или нет. Как быть?
pthread_join не подходит в принципе, ибо я уже объяснял почему, я её взову, а она управление не вернёт в вызывающий поток, пока тот поток, который я хочу присоединить не закончится. А мне работат надо.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 20:41 | 14 |
скажи для чего? может тут подходит совсем другая "тактика".
з.ы. pthread_join вызывать в конце концов придется. мы же не хотим утечек ресурсов? ![]()
0
|
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
|
|
07.02.2012, 20:46 | 15 |
retmas, pthread_cancel() таки убивает поток начисто, join уже не нужен. Но происходит это асинхронно, поэтому-то у kravam и возвращался ноль.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 21:09 | 16 |
нужен и еще как. зомби все равно останется
и при этом pthread_join в своем параметре(если он не NULL) вернет PTHREAD_CANCELED Добавлено через 3 минуты только если canceltype PTHREAD_CANCEL_ASYNCHRONOUS это зависит... Добавлено через 13 минут kravam, конкретизируй поболее свою задачу. думается мне нужны просто средства синхронизации(для чего?).
0
|
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
|
|
07.02.2012, 21:14 | 17 |
retmas, перечитал маны, местами был сильно неправ... Тем не менее, что у меня на домашней машине, что на liveworkspace pthread_kill() возвращает ESRCH.
1
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
||||||
07.02.2012, 21:34 | 18 | |||||
ну не знаю(баг?/несоответствие с POSIX?)
вообще ESRCH должно быть, если бы было как-то так
Добавлено через 3 минуты решил проверить. у меня на домашней машине 0(хоть с канселом, хоть без), если поток joinable, иначе ESRCH Добавлено через 8 минут скорее всего http://liveworkspace.org/code/... 506d81a52a pthread_join же не возвращает ESRCH
1
|
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
|
||||||
07.02.2012, 22:10 [ТС] | 19 | |||||
Хм интересно. Мне поток нельзя было делать откреплёным, поскольку необходимо было
использовать pthread_join (), но ведь одно другому не мешает, можно с успехом заменить pthread_join () проверкой потока на существование
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
07.02.2012, 23:08 | 20 |
хотя может и не баг, а просто "зависит от реализации". решил тоже перечитать маны
и если все-таки зависит от раелизации, проверять завершение с помощью pthread_kill можно только для конкретной реализации, а значит непереносимо Добавлено через 4 минуты может проще сделать или что-то вроде этого? Добавлено через 24 минуты вот, что нашел в описании pthread_join могу ошибаться Добавлено через 10 минут нашел еще интересную вещь, правда про kill() так что, kravam, ищите пути иные, чем pthread_kill ![]()
0
|
07.02.2012, 23:08 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Pthread взывать поток без параметров
Можно ли убить поток (pthread) сигналом (kill()) ? Как определить, что файл закончился при считывании с помощью binaryreader? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |