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

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

07.02.2012, 16:25. Просмотров 7663. Ответов 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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 16:45 2
pthread_join
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 17:01  [ТС] 3
Нет, не то. Дело в том, что pthread_join приостанавливает вызывающий поток до тех пор, пока запрашиваемый поток не закончится. Всё нормально, но именно приостанавливание меня и не устраивает.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 17:07 4
то есть надо просто как то сигналить?
тогда есть еще pthread_sigqueue , но это GNU расширение.
или писать свое

Добавлено через 1 минуту
ну или топорно:
даешь мьютекс, блокируешь в потоке(в самом начале, а перед концом - освобождаешь), try_lock в мэйне
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 17:20 5
Используй pthread_kill() с нулём в параметре сигнала.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 19:44  [ТС] 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) ; 
}
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 20:15 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(), а лучше вообще озаботься нормальной синхронизацией
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 20:20 8
Цитата Сообщение от NoMasters Посмотреть сообщение
pthread_kill()
выдает ESRCH, если поток не существует.
поток будет существовать после его завершения( в роли потока-"зомби"), иначе бы вызов pthread_join так же бы возвращал ESRCH. поэтому не годится для проверки завершения потока. она (с со значением сигнала 0) проверяет запускался ли вообще поток с таким id
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 20:24  [ТС] 9
Да я всяко и везде писал и 5 и 10 и 20 секунд, это же демонстрация, пример должен быть коротким. Короче, всё плохо.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 20:28 10
Цитата Сообщение от kravam Посмотреть сообщение
писал и 5 и 10 и 20 секунд
да хоть миллион. pthread_kill всегда возвратит 0, если поток Threadld успешно создавался и не было вызова pthread_join до вызова pthread_kill
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 20:29 11
Цитата Сообщение от retmas Посмотреть сообщение
поток будет существовать после его завершения
Ну так ТСу явно нужны detached потоки, иначе ловить выход и не нужно было бы.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 20:31 12
Цитата Сообщение от NoMasters Посмотреть сообщение
Ну так ТСу явно нужны detached потоки,
он об этом не говорил и в коде нигде pthread_detach не вижу
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 20:37  [ТС] 13
Мне посто надо узнать, поток есть или нет. Как быть?

pthread_join не подходит в принципе, ибо я уже объяснял почему, я её взову, а она управление не вернёт в вызывающий поток, пока тот поток, который я хочу присоединить не закончится. А мне работат надо.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 20:41 14
скажи для чего? может тут подходит совсем другая "тактика".
з.ы. pthread_join вызывать в конце концов придется. мы же не хотим утечек ресурсов?
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 20:46 15
retmas, pthread_cancel() таки убивает поток начисто, join уже не нужен. Но происходит это асинхронно, поэтому-то у kravam и возвращался ноль.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 21:09 16
нужен и еще как. зомби все равно останется
и при этом pthread_join в своем параметре(если он не NULL) вернет PTHREAD_CANCELED

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

Добавлено через 13 минут
kravam, конкретизируй поболее свою задачу. думается мне нужны просто средства синхронизации(для чего?).
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
07.02.2012, 21:14 17
retmas, перечитал маны, местами был сильно неправ... Тем не менее, что у меня на домашней машине, что на liveworkspace pthread_kill() возвращает ESRCH.
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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/... 506d81a52a
pthread_join же не возвращает ESRCH
1
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
07.02.2012, 22:10  [ТС] 19
Хм интересно. Мне поток нельзя было делать откреплёным, поскольку необходимо было
использовать pthread_join (), но ведь одно другому не мешает, можно с успехом заменить
pthread_join () проверкой потока на существование
C++
1
pthread_kill()
В цикле вызывать эту функцию и всё. Так что буду пробовать.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.02.2012, 23:08 20
Цитата Сообщение от retmas Посмотреть сообщение
Цитата Сообщение от retmas Посмотреть сообщение
баг?/несоответствие с POSIX?
скорее всего
http://liveworkspace.org/code/... 506d81a52a
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2012, 23:08

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

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?


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

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

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