В настоящее время у меня есть секция кода 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 с минимальным изменением в приведенном выше коде?
Ты можешь использовать 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);
}
...
}
Других решений пока нет …