Портирование кода под 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
Здравствуйте, 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
Здравствуйте, 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&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
Здравствуйте, 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
Здравствуйте, 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.
Не правильно... при ожидании семафора, лок надо отпустить... а при срабатывании атомарно захватить... почитай статью, которую я кинул...
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить