URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7263
[ Назад ]

Исходное сообщение
"Подскажите Аналог WaitForSingleObject(hThread,0)"

Отправлено deadka , 19-Мрт-08 00:42 
Здравствуй, Всемогущий all!
Пишу с использованием Posix threads. Проблема в следующем - в моем приложении основной поток создает дополнительный поток, и ему (основному потоку) иногда нужно проверять - а не закончил ли еще дополнительный поток свою работу?, но чтобы при этом основной поток не останавливал свою работу, то есть pthread_join, увы не подходит. В windows-программировании эту проблему легко решить с помощью вызова WaitForSingleObject(hAdditionalThread,0) - а как это можно сделать в Unix?, и по возможности posix-ными функциями (вроде pthread_tryjoin_np годится, но она непосиксовая :( )?

Подскажите кто знает пожалуйста - ибо решение в виде заведения атомарной или защищенной mutex'ом переменной для статуса потока и последующая работа через нее все же абсолютно не прельщает.


Содержание

Сообщения в этом обсуждении
"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено Wulf , 19-Мрт-08 02:03 
>Подскажите кто знает пожалуйста - ибо решение в виде заведения атомарной или
>защищенной mutex'ом переменной для статуса потока и последующая работа через нее
>все же абсолютно не прельщает.

если один поток только пишет, а другой только читает, переменную статуса можно сделать просто int. ее запись и чтение будут атомарными и без мутексов. Только, вероятно, нужно volatile добавить, чтоб компилятор лишнего не соптимизировал.


"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено Wulf , 19-Мрт-08 02:05 
если один поток только пишет, а другой только читает - это про переменную статуса

"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено deadka , 19-Мрт-08 11:34 
>если один поток только пишет, а другой только читает - это про
>переменную статуса

Спасибо за совет. Писать оба будут, но это не столь уж и важно в данном случае - непонятно как определить - а работает ли дополнительный поток, не прерывая при этом работу основного


"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено Wulf , 19-Мрт-08 12:08 
>>если один поток только пишет, а другой только читает - это про
>>переменную статуса
>
>Спасибо за совет. Писать оба будут, но это не столь уж и
>важно в данном случае - непонятно как определить - а работает
>ли дополнительный поток, не прерывая при этом работу основного

я неправильно выразился. Если один активный поток только устанавливает значение переменной статуса, а другой(другие) ожидающие только используют эти значения и не изменяют, то операции над переменной статуса будут атомарными и без мутексов. По крайней мере, это верно для типа int. Т.е. вам нужно выставить статус в активный перед созданием дополнительного потока и сбросить перед выходом. а в основном просто периодически проверять и все это делать БЕЗ мутексов.


"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено deadka , 19-Мрт-08 12:23 
>[оверквотинг удален]
>>важно в данном случае - непонятно как определить - а работает
>>ли дополнительный поток, не прерывая при этом работу основного
>
>я неправильно выразился. Если один активный поток только устанавливает значение переменной статуса,
>а другой(другие) ожидающие только используют эти значения и не изменяют, то
>операции над переменной статуса будут атомарными и без мутексов. По крайней
>мере, это верно для типа int. Т.е. вам нужно выставить статус
>в активный перед созданием дополнительного потока и сбросить перед выходом. а
>в основном просто периодически проверять и все это делать БЕЗ мутексов.
>

Спасибо большое за ответ, идею понял. Можно еще atomic'ами вроде, но они не posix :(.


"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено Wulf , 19-Мрт-08 14:02 

>Можно еще atomic'ами вроде, но они не posix :(.

atomic-и понадобятся если захочется сделать инкремент, сложение, обмен, обмен с проверкой и т.п. операции, т.е. которые при компиляции в C имеют шансы разложится на чтение в одной инструкции, запись в другой и race window посередине. просто независимое чтение и независимая запись int-а всегда выполняется в 1 инструкцию и поэтому атомарно без применения специальных функций.


"Подскажите Аналог WaitForSingleObject(hThread,0)"
Отправлено dronord , 20-Мрт-08 11:00 
Кому-то я уже здесь рассказывал, pthread_kill(tid, 0);