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

C++

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

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

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

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

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

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

Как аннулироват потоки, которые заблокированы по перменной условия (pthread)? - C++
И никак, что ли не аннулировать, получается? Вот, допустим, есть несколько потоков которые заблокированы по переменной условия: ...

Как узнать прекратил поток работу или нет? - C++ Builder
Здравствуйте все! Можно ли как то узнать работает в данный момент функция Execute потока TThread или нет? Добавлено через 15 минут ...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток)) - C++ Builder
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Как узнать что открыл? - C++ Builder
Привет. У меня на форме TButton,TEdit,TOpenDialog. При нажатии кнопки срабатывает OpenDialog и при выборе файла *.txt в TEdit будет...

Как узнать, что отпущена горячая клавиша - C++ Builder
На форме есть компонент ApplicationEvents. Он отслеживает нажатие горячих клавиш. А есть ли способ отследить что горячая клавиша...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 21:09 #16
нужен и еще как. зомби все равно останется
и при этом pthread_join в своем параметре(если он не NULL) вернет PTHREAD_CANCELED

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

Добавлено через 13 минут
kravam, конкретизируй поболее свою задачу. думается мне нужны просто средства синхронизации(для чего?).
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
07.02.2012, 21:14 #17
retmas, перечитал маны, местами был сильно неправ... Тем не менее, что у меня на домашней машине, что на liveworkspace pthread_kill() возвращает ESRCH.
1
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 21:34 #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
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
07.02.2012, 22:10  [ТС] #19
Хм интересно. Мне поток нельзя было делать откреплёным, поскольку необходимо было
использовать pthread_join (), но ведь одно другому не мешает, можно с успехом заменить
pthread_join () проверкой потока на существование
C++
1
pthread_kill()
В цикле вызывать эту функцию и всё. Так что буду пробовать.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 23:08 #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
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.02.2012, 23:30 #21
поведение pthread колеблется от платформы к платформе.
к тому же, как я (и не только) уже не однократно говорил ТС`у: pthread - переносимая абстракция. она не может включать в себя все специфические для всех платформы фитчи/поведения.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
08.02.2012, 00:07  [ТС] #24
Так это я понял, правда из русскоязычного ресурса :посылает голову пеплом: но тем не менее
В случае ошибки при выполнении функцииpthread_kill()сигнал не посылается.


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


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

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

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

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

И если бы не было pthread_kill я бы так всё и делал.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
08.02.2012, 16:51 #27
Цитата Сообщение от kravam Посмотреть сообщение
ты код что ли привёл где?
ты сам его написал. и тебе показали, что результаты могут быть различны в разных реализациях. а почему так, показано было в обсуждении того, что posix говорит об этом случае - unspecified.
а вообще, задача мне кажется слишком надуманной и не имеющей практического применения. может ошибаюсь, но так и не увидел главного - для чего все это. если был бы ответ, может, и решение появилось (вероятно, другое).
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 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
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 16:47 #29
niXman, к сожалению это не тот случай, который тут обсуждали. к тому же обсуждение идет (как я понял) о реализации на C, используя посикс потоки - для реализации поведения вашего кода есть pthread_cond_broadcast.
ТС упорно не хочет использовать средства синхронизации для того, чтобы узнать о состоянии потока. ему подавай pthread_kill для этих целей. в случае, показанном вами(отсоединенный поток), pthread_kill из мэйн потока как раз сгодится. но в его случае поток joinable.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 16:47
Привет! Вот еще темы с ответами:

Как узнать что выбран пункт меню TMenuItem в С++ Builder 2010? - C++ Builder
Здравствуйте! Нужно узнать что пользователь нажал на определенный пункт меню. На форме есть компонент MainMenu. В нем есть подпункты...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.02.2012, 16:47
Ответ Создать тему
Опции темы

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