Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.74/39: Рейтинг темы: голосов - 39, средняя оценка - 4.74
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
1

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

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

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

Так-то можно в принципе сделать так: передавать в функцию потока Y параметром указатель на какой-нибудь флаг, и если поток Y заканчивается корректно, то он бы этот флаг, допустим обнулял. А потом проверять значение этого флага и по его значению определять- поток Y существует или нет. Но хотелсь бы попроще как-нибудь с помощьюю pthread-функции ккой-нибудь, если таковые есть. Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2012, 16:25
Ответы с готовыми решениями:

как узнать закончился ли АП PR?
субж !!! вроде бы значения уже сменились и вдруг опять начали немного меняться.

Как узнать, что поток не завершен
Помогите с таким вопросом: Есть класс, в котором создается поток подачи звукового сигнала...

Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Да, как? #include <windows.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> ...

библиотека pthread.h в Code::Blocks
не могу найти как подключить библиотеку pthread.h в Code::Blocks. Помогите,пожалуйста, кто знает.

28
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 23:30 21
поведение pthread колеблется от платформы к платформе.
к тому же, как я (и не только) уже не однократно говорил ТС`у: pthread - переносимая абстракция. она не может включать в себя все специфические для всех платформы фитчи/поведения.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 23:49  [ТС] 22
Так-то я понимаю, что всё плохо. Проще вообще не программировать, тогда и не столкнусь с несоответствием всего всему!

Добавлено через 3 минуты
retmas, а это что значит?
As in kill(), if sig is zero, error checking shall be performed but no signal shall actually be sent
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.02.2012, 00:00 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 для посылки сигнала, но никакого сигнала послано не будет
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
08.02.2012, 00:07  [ТС] 24
Так это я понял, правда из русскоязычного ресурса :посылает голову пеплом: но тем не менее
В случае ошибки при выполнении функцииpthread_kill()сигнал не посылается.


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


0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.02.2012, 00:17 25
так там же написано
Если аргумент signo равен нулю, то выполняются проверки на ошибку, но сигнал фактически не посылается
а на счет
Цитата Сообщение от kravam Посмотреть сообщение
лишь бы ошибку возвернул (в моём случае ESRCH)
я уже показал, что результат unspecified для завершивихся, но находящихся в состоянии "зомби"

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

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

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

И если бы не было pthread_kill я бы так всё и делал.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.02.2012, 16:51 27
Цитата Сообщение от kravam Посмотреть сообщение
ты код что ли привёл где?
ты сам его написал. и тебе показали, что результаты могут быть различны в разных реализациях. а почему так, показано было в обсуждении того, что posix говорит об этом случае - unspecified.
а вообще, задача мне кажется слишком надуманной и не имеющей практического применения. может ошибаюсь, но так и не увидел главного - для чего все это. если был бы ответ, может, и решение появилось (вероятно, другое).
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:14 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() пока не реализована ни одним производителем компиляторов
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 16:47 29
niXman, к сожалению это не тот случай, который тут обсуждали. к тому же обсуждение идет (как я понял) о реализации на C, используя посикс потоки - для реализации поведения вашего кода есть pthread_cond_broadcast.
ТС упорно не хочет использовать средства синхронизации для того, чтобы узнать о состоянии потока. ему подавай pthread_kill для этих целей. в случае, показанном вами(отсоединенный поток), pthread_kill из мэйн потока как раз сгодится. но в его случае поток joinable.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2012, 16:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Pthread взывать поток без параметров
void RunClient(){ int iret; const char *message = &quot;Thread Run_Client()&quot;; if...

Pthread, поток, передающий значение по указателю
Создаётся поток, передающий значение по указателю: pthread_create (&amp;pthread_id1, NULL,...

Можно ли убить поток (pthread) сигналом (kill()) ?
Процесс убивается вызовом kill(pid, 9); Как убить не весь процесс а только поток? Можно...

Как определить, что файл закончился при считывании с помощью binaryreader?
как установить что файл закончался при считывании с помощью binaryreader?


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

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