Портирование кода под Windows
От: Linuxoid  
Дата: 13.11.04 18:23
Оценка:
Как портировать под Windows такой код:

pthread_mutex_lock (&m_pMutex);
if (status != ST_STOPPED && status != ST_ERROR)
{
    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
}
pthread_mutex_unlock (&m_pMutex);


Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.
Re: Портирование кода под Windows
От: fAX Израиль  
Дата: 13.11.04 20:54
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Как портировать под Windows такой код:


L>
L>pthread_mutex_lock (&m_pMutex);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
L>}
L>pthread_mutex_unlock (&m_pMutex);
L>


L>Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.

В Windows можно синхронизироваться на множество объектов, в том числе, на thread'ы, mutex'ы semaphore'ы critical section'ы. Вполне возможно, твоя задача может быть реализована чуть по-другому в парадигме Windows (чуть не написал, "Windows-way" ).
Попробуй посмотреть здесь ==> http://www.talkaboutprogramming.com/group/comp.programming.threads/messages/34622.html, если не поможет, я попробую завтра-послезавтра написать.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re: Портирование кода под Windows
От: MaximE Великобритания  
Дата: 14.11.04 14:11
Оценка:
Linuxoid wrote:

> Как портировать под Windows такой код:

>
>
> pthread_mutex_lock (&m_pMutex);
> if (status != ST_STOPPED && status != ST_ERROR)
> {
>     pthread_cond_wait (&m_pSemaphore, &m_pMutex);
> }
> pthread_mutex_unlock (&m_pMutex);
>


Ожидание события не вполне корректно. pthread_cond_wait может вернуть управление по ложному сигналу (явление называется spurious wakeups), поэтому обычно pthread_cond_wait вызывают в цикле:

while(status != ST_STOPPED && status != ST_ERROR)
{
     pthread_cond_wait (&m_pSemaphore, &m_pMutex);
}


> Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.


Реализовать condition на основе семафоров, как это сделано в win32 реализации boost::thread. Или переписать код на использование win32 примитивов синхронизации — CRITICAL_SECTION + Event:

HANDLE event = ... // autoreset event;
CRITICAL_SECTION cs;

EnterCriticalSection(&cs);
while(status != ST_STOPPED && status != ST_ERROR)
{
     LeaveCriticalSection(&cs);
     WaitForSingleObject(event, INFINITE);
     EnterCriticalSection(&cs);
}
LeaveCriticalSection(&cs);


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re: Портирование кода под Windows
От: Eugene Kilachkoff Россия  
Дата: 14.11.04 17:29
Оценка:
Здравствуйте, Linuxoid, Вы писали:
L>Как портировать под Windows такой код:
L>
L>pthread_mutex_lock (&m_pMutex);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
L>}
L>pthread_mutex_unlock (&m_pMutex);
L>


L>Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.

Сразу скажу, что сам не делал, но нижеследующая идея должна сработать.
В принципе, ближайший аналог condvar под виндами — это event. Так что эмулируем pthread_cond_wait с помощью
winthread_cond_wait(HANDLE condvar,HANDLE mutex)
{
    SignalObjectAndWait(mutex,condvar);
    WaitForSingleObject(mutex);
}

а pthread_cond_notify с помощью SetEvent — и все должно работать.
... << RSDN@Home 1.1.3 stable >>
Re: Портирование кода под Windows
От: aka50 Россия  
Дата: 15.11.04 07:22
Оценка: 20 (1)
Здравствуйте, Linuxoid, Вы писали:

L>Как портировать под Windows такой код:


L>
L>pthread_mutex_lock (&m_pMutex);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
L>}
L>pthread_mutex_unlock (&m_pMutex);
L>


L>Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.


Вот тут теория и примеры реализации
http://www.cs.wustl.edu/~schmidt/win32-cv-1.html

Еще в Boost есть приличная реализация... смотри
http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/thread/src/condition.cpp?rev=1.20&amp;view=auto
(если нужно под С, то не страшно, для С легко переделывается...).

ЗЫ: Не рекомедную изобретать и упрощать... дело в странных особенностях
виндовых сигналов. Лично сталкивался... особенно PulseEvent()
Re[2]: Портирование кода под Windows
От: MaximE Великобритания  
Дата: 15.11.04 08:47
Оценка: +1
aka50 wrote:

[]

> ЗЫ: Не рекомедную изобретать и упрощать... дело в странных особенностях

> виндовых сигналов. Лично сталкивался... особенно PulseEvent()

PulseEvent() — ф-ция ведущая прямиком к ошибкам. Рихтер в своих книгах рекоммендует ее не использовать вообще.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[3]: Портирование кода под Windows
От: aka50 Россия  
Дата: 15.11.04 09:55
Оценка: :)
Здравствуйте, MaximE, Вы писали:

ME>PulseEvent() — ф-ция ведущая прямиком к ошибкам. Рихтер в своих книгах рекоммендует ее не использовать вообще.


Угу . Только я в то время, когда PulseEvent использовал, еще Рихтера не читал . И наелся евентами виндовыми
по самое нехочу .
Re[2]: Портирование кода под Windows
От: MaximE Великобритания  
Дата: 15.11.04 19:29
Оценка:
aka50 wrote:

> Вот тут теория и примеры реализации

> http://www.cs.wustl.edu/~schmidt/win32-cv-1.html

Статья очень неплохая.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re: Портирование кода под Windows
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 18.11.04 12:54
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Как портировать под Windows такой код:


L>
L>pthread_mutex_lock (&m_pMutex);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
L>}
L>pthread_mutex_unlock (&m_pMutex);
L>


L>Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.


And also a straightforward way: use Pthreads library in Win32
-- Андрей
Re: Портирование кода под Windows
От: FrIcE http://www.utmn.ru/~frice
Дата: 19.11.04 09:02
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Как портировать под Windows такой код:


L>
L>pthread_mutex_lock (&m_pMutex);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    pthread_cond_wait (&m_pSemaphore, &m_pMutex);
L>}
L>pthread_mutex_unlock (&m_pMutex);
L>


L>Проблема в том, как атомарно проверить переменную status и вызвать ожидание события.


что — то вроде

L>
L>EnterCriticalSection (&m_pLock);
L>if (status != ST_STOPPED && status != ST_ERROR)
L>{
L>    WaitForSingleObject (&m_pSemaphore, INFINITE);
L>}
L>LeaveCriticalSection (&m_pLock);
L>


Соответственно придётся поменять инициализацию блокирующего объкта (Ктирической секции) и семафора под WinAPI.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Портирование кода под Windows
От: aka50 Россия  
Дата: 19.11.04 09:30
Оценка:
Здравствуйте, FrIcE, Вы писали:

FIE>что — то вроде


L>>
L>>EnterCriticalSection (&m_pLock);
L>>if (status != ST_STOPPED && status != ST_ERROR)
L>>{
L>>    WaitForSingleObject (&m_pSemaphore, INFINITE);
L>>}
L>>LeaveCriticalSection (&m_pLock);
L>>


FIE>Соответственно придётся поменять инициализацию блокирующего объкта (Ктирической секции) и семафора под WinAPI.


Не правильно... при ожидании семафора, лок надо отпустить... а при срабатывании атомарно захватить... почитай статью, которую я кинул...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.