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

C++

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

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

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

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

Так-то можно в принципе сделать так: передавать в функцию потока Y параметром указатель на какой-нибудь флаг, и если поток Y заканчивается корректно, то он бы этот флаг, допустим обнулял. А потом проверять значение этого флага и по его значению определять- поток Y существует или нет. Но хотелсь бы попроще как-нибудь с помощьюю pthread-функции ккой-нибудь, если таковые есть. Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 16:25     Как узнать, что поток закончился (библиотека pthread)?
Посмотрите здесь:
C++ Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
библиотека pthread.h в Code::Blocks C++
C++ Pthread взывать поток без параметров
Pthread, поток, передающий значение по указателю C++
Можно ли убить поток (pthread) сигналом (kill()) ? C++ Linux
Как узнать прекратил поток работу или нет? C++ Builder
C++ Как узнать, что в ком порт что-то записалось?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 21:09     Как узнать, что поток закончился (библиотека pthread)? #16
нужен и еще как. зомби все равно останется
и при этом pthread_join в своем параметре(если он не NULL) вернет PTHREAD_CANCELED

Добавлено через 3 минуты
Цитата Сообщение от NoMasters Посмотреть сообщение
происходит это асинхронно
только если canceltype PTHREAD_CANCEL_ASYNCHRONOUS
Цитата Сообщение от NoMasters Посмотреть сообщение
убивает поток начисто
это зависит...

Добавлено через 13 минут
kravam, конкретизируй поболее свою задачу. думается мне нужны просто средства синхронизации(для чего?).
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
07.02.2012, 21:14     Как узнать, что поток закончился (библиотека pthread)? #17
retmas, перечитал маны, местами был сильно неправ... Тем не менее, что у меня на домашней машине, что на liveworkspace pthread_kill() возвращает ESRCH.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 21:34     Как узнать, что поток закончился (библиотека pthread)? #18
ну не знаю(баг?/несоответствие с POSIX?)
вообще ESRCH должно быть, если бы было как-то так
C
1
2
3
4
5
6
7
        pthread_t ThreadA; // Объявляем потоки. 
        pthread_create(&ThreadA,NULL,taskl,NULL); // Создаем  потоки. 
        pthread_detach(ThreadA);
        usleep(5000);
        
        printf ("Узнаем есть поток A или нет \n");
        printf ("==== %d\n", pthread_kill(ThreadA,0));
но ТС не делает поток отсоединенным

Добавлено через 3 минуты
решил проверить. у меня на домашней машине 0(хоть с канселом, хоть без), если поток joinable, иначе ESRCH

Добавлено через 8 минут
Цитата Сообщение от retmas Посмотреть сообщение
(баг?/несоответствие с POSIX?)
скорее всего
http://liveworkspace.org/code/f8a02a...460a506d81a52a
pthread_join же не возвращает ESRCH
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
07.02.2012, 22:10  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #19
Хм интересно. Мне поток нельзя было делать откреплёным, поскольку необходимо было
использовать pthread_join (), но ведь одно другому не мешает, можно с успехом заменить
pthread_join () проверкой потока на существование
C++
1
pthread_kill()
В цикле вызывать эту функцию и всё. Так что буду пробовать.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 23:08     Как узнать, что поток закончился (библиотека pthread)? #20
Цитата Сообщение от retmas Посмотреть сообщение
Цитата Сообщение от retmas Посмотреть сообщение
баг?/несоответствие с POSIX?
скорее всего
http://liveworkspace.org/code/f8a02a...460a506d81a52a
pthread_join же не возвращает ESRCH
хотя может и не баг, а просто "зависит от реализации". решил тоже перечитать маны
The pthread_kill() function is used to request that a signal be delivered to the specified thread.
может ли сигнал быть delivered потоку-зомби?
и если все-таки зависит от раелизации, проверять завершение с помощью pthread_kill можно только для конкретной реализации, а значит непереносимо

Добавлено через 4 минуты
Цитата Сообщение от kravam Посмотреть сообщение
В цикле вызывать эту функцию и всё. Так что буду пробовать.
может проще сделать
Цитата Сообщение от retmas Посмотреть сообщение
топорно:
даешь мьютекс, блокируешь в потоке(в самом начале, а перед концом - освобождаешь), try_lock в мэйне
или что-то вроде этого?

Добавлено через 24 минуты
вот, что нашел в описании pthread_join
It is unspecified whether a thread that has exited but remains unjoined counts against {PTHREAD_THREADS_MAX}.
думаю, это значит также, что unspecified, валидный ли id потока-зомби и можно ли воздействовать на такой поток какими-либо ф-ми, кроме pthread_join.
могу ошибаться

Добавлено через 10 минут
нашел еще интересную вещь, правда про kill()
Existing implementations vary on the result of a kill() with pid indicating an inactive process (a terminated process that has not been waited for by its parent). Some indicate success on such a call (subject to permission checking), while others give an error of [ESRCH]. Since the definition of process lifetime in this volume of IEEE Std 1003.1-2001 covers inactive processes, the [ESRCH] error as described is inappropriate in this case. In particular, this means that an application cannot have a parent process check for termination of a particular child with kill().
но думаю здесь именно этот случай, поскольку про pthread_kill сказано
As in kill(), if sig is zero, error checking shall be performed but no signal shall actually be sent.
так что проверять, завершился ли поток с помощью pthread_kill - не верно

так что, kravam, ищите пути иные, чем pthread_kill
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 23:30     Как узнать, что поток закончился (библиотека pthread)? #21
поведение pthread колеблется от платформы к платформе.
к тому же, как я (и не только) уже не однократно говорил ТС`у: pthread - переносимая абстракция. она не может включать в себя все специфические для всех платформы фитчи/поведения.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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
Жарю без масла
859 / 741 / 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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
08.02.2012, 00:07  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #24
Так это я понял, правда из русскоязычного ресурса :посылает голову пеплом: но тем не менее
В случае ошибки при выполнении функцииpthread_kill()сигнал не посылается.


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


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

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

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

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

И если бы не было pthread_kill я бы так всё и делал.
retmas
Жарю без масла
859 / 741 / 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++ Как считывать слова/цифры пока не закончился ввод пользователем
Файловый поток узнать количество строк C++
Visual C++ Как в Visual Studio 2008 подключить библиотеку pthread.h?
Pthread.h, как вернуть из потоковой функции значение типа double? C++
C++ Как аннулироват потоки, которые заблокированы по перменной условия (pthread)?

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

Или воспользуйтесь поиском по форуму:
retmas
Жарю без масла
859 / 741 / 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)?
Ответ Создать тему
Опции темы

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