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

C++

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

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

07.02.2012, 16:25. Просмотров 5180. Ответов 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 16:45     Как узнать, что поток закончился (библиотека pthread)? #2
pthread_join
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
07.02.2012, 17:01  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #3
Нет, не то. Дело в том, что pthread_join приостанавливает вызывающий поток до тех пор, пока запрашиваемый поток не закончится. Всё нормально, но именно приостанавливание меня и не устраивает.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 17:07     Как узнать, что поток закончился (библиотека pthread)? #4
то есть надо просто как то сигналить?
тогда есть еще pthread_sigqueue , но это GNU расширение.
или писать свое

Добавлено через 1 минуту
ну или топорно:
даешь мьютекс, блокируешь в потоке(в самом начале, а перед концом - освобождаешь), try_lock в мэйне
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
07.02.2012, 17:20     Как узнать, что поток закончился (библиотека pthread)? #5
Используй pthread_kill() с нулём в параметре сигнала.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
07.02.2012, 19:44  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream> 
#include <stdio.h> 
#include <pthread.h> 
#include <windows.h>
using namespace std;
 
 
void *taskl(void *X) { 
 pthread_t Threadld; 
 Threadld = pthread_self(); 
 printf ("TID A= %x\n", *(unsigned int*)Threadld.p);
 return NULL; 
} 
 
int main(int argc, char *argv[]) { 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 
 pthread_t ThreadA; // Объявляем потоки. 
 pthread_create(&ThreadA,NULL,taskl,NULL); // Создаем  потоки. 
 
 Sleep (5000);
 pthread_cancel(ThreadA);
 
 printf ("Узнаем есть поток A или нет \n");
 
 //Тут должен вернуться код ошибки, в частности
 //ESRCH: поток управления, соответствующий указанному идентификатору, не найден;
 //(#define    ESRCH 3), а возвращается 0, т есь получается, что
 //как минимум поток A существует, хотя его нет уже и в помине!  
 printf ("==== %d\n", pthread_kill(ThreadA,0));
 getchar ();
 return (0) ; 
}
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
07.02.2012, 20:15     Как узнать, что поток закончился (библиотека pthread)? #7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h> 
#include <signal.h>
#include <pthread.h>
 
 
void *taskl(void *X) { 
    pthread_t Threadld; 
    Threadld = pthread_self(); 
    printf ("TID A= %x\n", *(unsigned int*)Threadld);
    return NULL; 
} 
 
int main(int argc, char *argv[]) {
    
    
    pthread_t ThreadA; // Объявляем потоки. 
    pthread_create(&ThreadA,NULL,taskl,NULL); // Создаем  потоки. 
    
    usleep(5000);
    pthread_cancel(ThreadA);
    
    printf ("Узнаем есть поток A или нет \n");
    printf ("==== %d\n", pthread_kill(ThreadA,0));
    return (0) ; 
}
У меня стабильно тройка. А вообще заявлять, что
Цитата Сообщение от kravam Посмотреть сообщение
хотя его нет уже и в помине!
не стоит, тред умирает далеко не мгновенно. Попробуй вставить слип после pthread_cancel(), а лучше вообще озаботься нормальной синхронизацией
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 20:20     Как узнать, что поток закончился (библиотека pthread)? #8
Цитата Сообщение от NoMasters Посмотреть сообщение
pthread_kill()
выдает ESRCH, если поток не существует.
поток будет существовать после его завершения( в роли потока-"зомби"), иначе бы вызов pthread_join так же бы возвращал ESRCH. поэтому не годится для проверки завершения потока. она (с со значением сигнала 0) проверяет запускался ли вообще поток с таким id
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
07.02.2012, 20:24  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #9
Да я всяко и везде писал и 5 и 10 и 20 секунд, это же демонстрация, пример должен быть коротким. Короче, всё плохо.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 20:28     Как узнать, что поток закончился (библиотека pthread)? #10
Цитата Сообщение от kravam Посмотреть сообщение
писал и 5 и 10 и 20 секунд
да хоть миллион. pthread_kill всегда возвратит 0, если поток Threadld успешно создавался и не было вызова pthread_join до вызова pthread_kill
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
07.02.2012, 20:29     Как узнать, что поток закончился (библиотека pthread)? #11
Цитата Сообщение от retmas Посмотреть сообщение
поток будет существовать после его завершения
Ну так ТСу явно нужны detached потоки, иначе ловить выход и не нужно было бы.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 20:31     Как узнать, что поток закончился (библиотека pthread)? #12
Цитата Сообщение от NoMasters Посмотреть сообщение
Ну так ТСу явно нужны detached потоки,
он об этом не говорил и в коде нигде pthread_detach не вижу
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
07.02.2012, 20:37  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #13
Мне посто надо узнать, поток есть или нет. Как быть?

pthread_join не подходит в принципе, ибо я уже объяснял почему, я её взову, а она управление не вернёт в вызывающий поток, пока тот поток, который я хочу присоединить не закончится. А мне работат надо.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.02.2012, 20:41     Как узнать, что поток закончился (библиотека pthread)? #14
скажи для чего? может тут подходит совсем другая "тактика".
з.ы. pthread_join вызывать в конце концов придется. мы же не хотим утечек ресурсов?
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
07.02.2012, 20:46     Как узнать, что поток закончился (библиотека pthread)? #15
retmas, pthread_cancel() таки убивает поток начисто, join уже не нужен. Но происходит это асинхронно, поэтому-то у kravam и возвращался ноль.
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
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
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
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
07.02.2012, 22:10  [ТС]     Как узнать, что поток закончился (библиотека pthread)? #19
Хм интересно. Мне поток нельзя было делать откреплёным, поскольку необходимо было
использовать pthread_join (), но ведь одно другому не мешает, можно с успехом заменить
pthread_join () проверкой потока на существование
C++
1
pthread_kill()
В цикле вызывать эту функцию и всё. Так что буду пробовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 23:08     Как узнать, что поток закончился (библиотека pthread)?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
07.02.2012, 23:08     Как узнать, что поток закончился (библиотека pthread)?
Ответ Создать тему
Опции темы

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