C ++ 0x получает поддержку многопоточности, и эта поддержка включает в себя новый тип с именем condition_variable_any:
class condition_variable_any
{
public:
condition_variable_any();
~condition_variable_any();
condition_variable_any(const condition_variable_any&) = delete;
condition_variable_any& operator=(const condition_variable_any&) = delete;
void notify_one();
void notify_all();
template <class Lock>
void wait(Lock& lock);
template <class Lock, class Predicate>
void wait(Lock& lock, Predicate pred);
template <class Lock, class Clock, class Duration>
cv_status
wait_until(Lock& lock,
const chrono::time_point<Clock, Duration>& abs_time);
template <class Lock, class Clock, class Duration, class Predicate>
bool
wait_until(Lock& lock,
const chrono::time_point<Clock, Duration>& abs_time,
Predicate pred);
template <class Lock, class Rep, class Period>
cv_status
wait_for(Lock& lock,
const chrono::duration<Rep, Period>& rel_time);
template <class Lock, class Rep, class Period, class Predicate>
bool
wait_for(Lock& lock,
const chrono::duration<Rep, Period>& rel_time,
Predicate pred);
};
Здесь есть объяснение того, как реализовать condition_variable_any:
http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2007 / n2406.html # gen_cond_var
но по этой ссылке он называется gen_cond_var. Волшебная вещь в условии condition_variable_any заключается в том, что он будет ожидать чего-либо, имеющего члены lock () и unlock (). Если у вас есть condition_variable_any, то все, что вам нужно, это рулок. Ссылка выше также представляет shared_mutex и shared_lock и показывает пример кода, который делает то, что вы хотите:
std::tr2::shared_mutex mut;
std::gen_cond_var cv;
void wait_in_shared_ownership_mode()
{
std::tr2::shared_lock<std::tr2::shared_mutex> shared_lk(mut);
// mut is now shared-locked
// ...
while (not_ready_to_proceed())
cv.wait(shared_lk); // shared-lock released while waiting
// mut is now shared-locked
// ...
} // mut is now unlocked
void wait_in_unique_ownership_mode()
{
std::unique_lock<std::tr2::shared_mutex> lk(mut);
// mut is now unique-locked
// ...
while (not_ready_to_proceed())
cv.wait(lk); // unique-lock released while waiting
// mut is now unique-locked
// ...
} // mut is now unlocked
Приведенный выше документ несколько устарел. Более свежая реализация и описание shared_mutex / shared_lock здесь:
http://howardhinnant.github.io/shared_mutex http://howardhinnant.github.io/shared_mutex.cpp
Все это реализовано поверх pthreads POSIX. Я надеюсь получить информацию о разделяемой блокировке в техническом отчете C ++ (tr2), но, конечно, на это нет никаких гарантий.