#include <threads.hpp>
Данный синхронизирующий объект характеризуется тем, что он должен использоваться только вместе с объектом mutex_sem_t.
Принцип работы:
void read_data() { // Захватывается семафор. threads_1::mutex_sem_t::lock_t lock( g_sem ); // Проверяем наличие данных для чтения. // Обращаться к переменной is_data_available // можно только при захваченом семафоре g_sem. if( !is_data_available ) // Ожидаем поступления данных. // Важно то, что если данные есть, то // ожидать наступления события не нужно, // но семафор все равно должен быть // захвачен. g_cond.wait(); ... }
Перед обращением к методам notify_one и notify_all нужно обязательно захватить объект-семафор. В противном случае может возникнуть т.н. race condition -- когда нить, ожидающая события не успеет вызвать метод wait, в то время как порождающая событие нить осуществит вызов метода notify_one.
cond_var_t g_cond( &cond_var_t::own_mutex ); void read_data() { // Захватывается семафор. threads_1::mutex_sem_t::lock_t lock( g_cond ); // Проверяем наличие данных для чтения. // Обращаться к переменной is_data_available // можно только при захваченом семафоре g_sem. if( !is_data_available ) // Ожидаем поступления данных. // Важно то, что если данные есть, то // ожидать наступления события не нужно, // но семафор все равно должен быть // захвачен. g_cond.wait(); ... }
sample/cond_var/main.cpp, sample/cond_var_2/main.cpp, sample/cond_var_3/main.cpp, sample/cond_var_4/main.cpp и sample/simple_proc/main.cpp.
Открытые члены | |
cond_var_t () | |
Конструктор по-умолчанию. | |
cond_var_t (mutex_sem_t *(*mutex_creator)()) | |
Конструктор для создания собственного объекта mutex_sem_t. | |
cond_var_t (mutex_sem_t &sem) | |
void | wait () const |
Ожидать condition_variable. | |
void | wait (const mutex_sem_t &) const |
Ожидать с использованием указанного семафора. | |
operator const mutex_sem_t & () const | |
Позволяет использовать объект cond_var_t в качестве параметра конструктора mutex_sem_t::lock_t. | |
void | lock () const |
Захватить семафор с которым связан объект. | |
void | release () const |
Освободить семафор с которым связан объект. | |
void | notify_one () |
Запустить один процесс, ожидающий condition_variable. | |
void | notify_all () |
Запустить все процессы, ожидающие condition_variable. | |
Открытые статические члены | |
mutex_sem_t * | own_mutex () |
Создатель подчиненных объектов mutex_sem_t. | |
Защищенные данные | |
mutex_sem_t * | m_sem |
Семафор, который используется для предотвращения т.н. race conditions. | |
_os_cond_var_t * | m_cv |
bool | m_is_own_mutex |
Владеем ли мы объектом mutex_sem_t? |
|
Конструктор по-умолчанию.
|
|
Конструктор для создания собственного объекта mutex_sem_t.
|
|
|
|
Захватить семафор с которым связан объект.
|
|
Запустить все процессы, ожидающие condition_variable. Если никто не ждет, то событие считается сработавшим впустую.
|
|
Запустить один процесс, ожидающий condition_variable. Если никто не ждет, то событие считается сработавшим впустую.
|
|
Позволяет использовать объект cond_var_t в качестве параметра конструктора mutex_sem_t::lock_t.
|
|
Создатель подчиненных объектов mutex_sem_t.
|
|
Освободить семафор с которым связан объект.
|
|
Ожидать с использованием указанного семафора.
|
|
Ожидать condition_variable.
|
|
Владеем ли мы объектом mutex_sem_t?
|
|
Семафор, который используется для предотвращения т.н. race conditions. Может содержать 0, что означает, что пользователь cond_var_t может использовать разные объекты mutex_sem_t при обращении к wait. |