Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.98
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
#1

Как узнать, что поток закончился (библиотека pthread)? - C++

07.02.2012, 16:25. Просмотров 5118. Ответов 28
Метки нет (Все метки)

Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает- да, созданный ранее поток Y закончился?

Так-то можно в принципе сделать так: передавать в функцию потока Y параметром указатель на какой-нибудь флаг, и если поток Y заканчивается корректно, то он бы этот флаг, допустим обнулял. А потом проверять значение этого флага и по его значению определять- поток Y существует или нет. Но хотелсь бы попроще как-нибудь с помощьюю pthread-функции ккой-нибудь, если таковые есть. Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 16:25     Как узнать, что поток закончился (библиотека pthread)?
Посмотрите здесь:

Можно ли убить поток (pthread) сигналом (kill()) ? C++ Linux
C++ Builder Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))
C++ Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
C++ Как аннулироват потоки, которые заблокированы по перменной условия (pthread)?
C++ Как узнать, что в ком порт что-то записалось?
Visual C++ Как в Visual Studio 2008 подключить библиотеку pthread.h?
библиотека pthread.h в Code::Blocks C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 23:30     Как узнать, что поток закончился (библиотека pthread)? #21
поведение pthread колеблется от платформы к платформе.
к тому же, как я (и не только) уже не однократно говорил ТС`у: pthread - переносимая абстракция. она не может включать в себя все специфические для всех платформы фитчи/поведения.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
07.02.2012, 23:49  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #22
Так-то я понимаю, что всё плохо. Проще вообще не программировать, тогда и не столкнусь с несоответствием всего всему!

Добавлено через 3 минуты
retmas, а это что значит?
As in kill(), if sig is zero, error checking shall be performed but no signal shall actually be sent
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
08.02.2012, 00:00     Как узнать, что поток закончился (библиотека pthread)? #23
Цитата Сообщение от kravam Посмотреть сообщение
а это что значит?
As in kill(), if sig is zero, error checking shall be performed but no signal shall actually be sent
т.е. по сути при таком вызове
C
1
pthread_kill(ThreadA,0);
происходит проверка на валидность ThreadA для посылки сигнала, но никакого сигнала послано не будет
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
08.02.2012, 00:07  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #24
Так это я понял, правда из русскоязычного ресурса :посылает голову пеплом: но тем не менее
В случае ошибки при выполнении функцииpthread_kill()сигнал не посылается.


Так и чёртс ним, пусть он не посылается, лишь бы ошибку возвернул (в моём случае ESRCH)


retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
08.02.2012, 00:17     Как узнать, что поток закончился (библиотека pthread)? #25
так там же написано
Если аргумент signo равен нулю, то выполняются проверки на ошибку, но сигнал фактически не посылается
а на счет
Цитата Сообщение от kravam Посмотреть сообщение
лишь бы ошибку возвернул (в моём случае ESRCH)
я уже показал, что результат unspecified для завершивихся, но находящихся в состоянии "зомби"

Добавлено через 2 минуты
но даже если бы было так, как ты хочешь, чем вызов pthread_kill лучше проверки некоего обьекта / флага до вызова pthread_join (как я понял ты этого хочешь), говорящем о том , что поток завершился
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
08.02.2012, 00:30  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #26
Цитата Сообщение от retmas Посмотреть сообщение
я уже показал, что результат unspecified для завершивихся, но находящихся в состоянии "зомби"
ты код что ли привёл где?

Цитата Сообщение от retmas Посмотреть сообщение
но даже если бы было так, как ты хочешь, чем вызов pthread_kill лучше проверки некоего обьекта / флага до вызова pthread_join (как я понял ты этого хочешь), говорящем о том , что поток завершился
ничем наверное в принципе, просто если потоков несколько как у меня, это уже несколько флагов. А если ещё и при компиляции неизвестно, сколько будет потоков, то это уже динамический массив флагов. А если в процессе выполнения программы неизвестно, создастся ли очередной поток или нет- это нужно каждый раз выделять память под массив флагов, потом старый массив переписывать в новый... Ну короче суета сует и томление духа.

Да, ещё указатель на флаг надо передавать в функцию потока- поток при своём завершении должен же изменить флаг!

И если бы не было pthread_kill я бы так всё и делал.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
08.02.2012, 16:51     Как узнать, что поток закончился (библиотека pthread)? #27
Цитата Сообщение от kravam Посмотреть сообщение
ты код что ли привёл где?
ты сам его написал. и тебе показали, что результаты могут быть различны в разных реализациях. а почему так, показано было в обсуждении того, что posix говорит об этом случае - unspecified.
а вообще, задача мне кажется слишком надуманной и не имеющей практического применения. может ошибаюсь, но так и не увидел главного - для чего все это. если был бы ответ, может, и решение появилось (вероятно, другое).
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:14     Как узнать, что поток закончился (библиотека pthread)? #28
оказывается эта возможность предусмотрена стандартом С++11.

можно будет писать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
std::mutex m;
std::condition_variable cv;
 
void thread_func()
{
    std::unique_lock<std::mutex> lk(m);
   
    что-то выполняем....
 
    std::notify_all_at_thread_exit(cv, lk);
}
 
int main() {
    std::thread t(thread_func);
    t.detach(); // отсоединяем поток
 
    что-то еще выполняем...
 
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk); // ждем завершения
 
    по завершению потока оказываемся тут!
}
но std::notify_all_at_thread_exit() пока не реализована ни одним производителем компиляторов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 16:47     Как узнать, что поток закончился (библиотека pthread)?
Еще ссылки по теме:

C++ Pthread взывать поток без параметров
C++ Как считывать слова/цифры пока не закончился ввод пользователем
Pthread, поток, передающий значение по указателю C++
Pthread.h, как вернуть из потоковой функции значение типа double? C++
Как узнать прекратил поток работу или нет? C++ Builder

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 16:47     Как узнать, что поток закончился (библиотека pthread)? #29
niXman, к сожалению это не тот случай, который тут обсуждали. к тому же обсуждение идет (как я понял) о реализации на C, используя посикс потоки - для реализации поведения вашего кода есть pthread_cond_broadcast.
ТС упорно не хочет использовать средства синхронизации для того, чтобы узнать о состоянии потока. ему подавай pthread_kill для этих целей. в случае, показанном вами(отсоединенный поток), pthread_kill из мэйн потока как раз сгодится. но в его случае поток joinable.
Yandex
Объявления
09.02.2012, 16:47     Как узнать, что поток закончился (библиотека pthread)?
Ответ Создать тему
Опции темы

Текущее время: 20:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru