Повышение эквивалентной переменной условия с CRITICAL_SECTION

В настоящее время у меня есть секция кода boost :: mutex в моем приложении, которая выглядит примерно так

{//Lock
boost::unique_lock<boost::mutex> lock(some_mutex);
while(container.empty())
{
condition_var.wait(lock);
}/*Block if empty - for spurious wakeup*/
......
,,,,,,
}//Unlock

Теперь some_mutex имеет тип boost :: mutex
и condition_var имеет тип boost :: condition_variable

Теперь condition_var запускается с condition_var.notifyone() Метод, к сожалению, этот метод принимает boost :: mutex для работы.
Я планирую удалить boost :: mutex и использовать предоставленные окна CRITICAL_SECTION. Однако я считаю, что условие повышения не работает с окнами CRITICAL_SECTION
Любое предложение о том, что мои варианты могут быть заменить boost :: mutex на CRITICAL_SECTION с минимальным изменением в приведенном выше коде?

0

Решение

Ты можешь использовать boost::condition_variable_any с любым мьютексоподобным объектом, таким как CRITICAL_SECTION, (как говорится в комментарии DaveS)

Но я настоятельно рекомендую вам выполнить профилирование и сравнить вашу первую простую версию со следующим кодом.

#include <windows.h>
#include <boost/thread/condition_variable.hpp>

// wrapper class for CriticalSection
class win32cs_mutex : boost::noncopyable {
public:
win32cs_mutex()  { ::InitializeCriticalSection(&cs_); }
~win32cs_mutex() { ::DeleteCriticalSection(&cs_); }
void lock()   { ::EnterCriticalSection(&cs_); }
void unlock() { ::LeaveCriticalSection(&cs_): }
private:
CRITICAL_SECTION cs_;
};

win32cs_mutex some_mutex;
boost::condition_variable_any condition_var;

// client code
{
boost::unique_lock<win32cs_mutex> lock(some_mutex);
while(container.empty())
{
condition_var.wait(lock);
}
...
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector