reader_writer_lock 类
具有仅限本地旋转的基于编写器首选队列的读取器-编写器锁。 锁授予对编写器的先进先出 (FIFO) 访问权限,并在出现编写器持续负载的情况下停止读取器。
语法
class reader_writer_lock;
成员
公共类
名称 | 描述 |
---|---|
reader_writer_lock::scoped_lock 类 | 异常安全 RAII 包装器,可用于以编写者身份获取 reader_writer_lock 锁对象。 |
reader_writer_lock::scoped_lock_read 类 | 异常安全 RAII 包装器,可用于以读者身份获取 reader_writer_lock 锁对象。 |
公共构造函数
名称 | 描述 |
---|---|
reader_writer_lock | 构造新的 reader_writer_lock 对象。 |
~reader_writer_lock Destructor | 销毁 reader_writer_lock 对象。 |
公共方法
名称 | 描述 |
---|---|
lock | 以编写者身份获取读写锁。 |
lock_read | 以读者身份获取读写锁。 如果存在编写者,则活跃读者必须等到编写者完成工作。 读者只注册对锁的一个兴趣,并等待编写者释放它。 |
try_lock | 尝试在无阻塞的情况下以编写者身份获取读写锁。 |
try_lock_read | 尝试在无阻塞的情况下以读者身份获取读写锁。 |
unlock | 基于锁定者身份(是读者还是编写者)解锁读写锁。 |
备注
有关详细信息,请参阅同步数据结构。
继承层次结构
reader_writer_lock
要求
标头:concrt.h
命名空间: 并发
lock
以编写者身份获取读写锁。
void lock();
备注
利用 scoped_lock 构造,以编写者身份通过异常安全方式获取和释放 reader_writer_lock
对象通常更安全。
在编写器尝试获取锁后,在编写器成功获取和释放该锁之前任何将来的读取器都将阻塞。 这种锁偏向编写者,可以让读者在编写者连续的负载下无资源可用。
编写者是相互关联的,这样退出锁的编写者就可释放队列中的下一个编写者。
如果调用上下文已持有锁,则会引发 improper_lock 异常。
lock_read
以读者身份获取读写锁。 如果存在编写者,则活跃读者必须等到编写者完成工作。 读者只注册对锁的一个兴趣,并等待编写者释放它。
void lock_read();
注解
利用 构造,以读者身份通过异常安全方式获取和释放 reader_writer_lock
对象通常更安全。
如果有编写者正在等待锁,则读者将一直等待,直到队列中的所有编写者都已获取并释放锁。 这种锁偏向编写者,可以让读者在编写者连续的负载下无资源可用。
reader_writer_lock
构造新的 reader_writer_lock
对象。
reader_writer_lock();
~reader_writer_lock
销毁 reader_writer_lock
对象。
~reader_writer_lock();
备注
析构函数运行时,应不再持有锁。 若在仍持有锁的情况下允许析构读写锁,则会导致未定义的行为。
reader_writer_lock::scoped_lock 类
异常安全 RAII 包装器,可用于以编写者身份获取 reader_writer_lock
锁对象。
class scoped_lock;
scoped_lock::scoped_lock
构造 scoped_lock
对象,并获取在 _Reader_writer_lock
参数中以编写者身份传递的 reader_writer_lock
对象。 如果该锁由另一个线程持有,则此调用将被阻止。
explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);
参数
_Reader_writer_lock
要以编写者身份获取的 reader_writer_lock
对象。
scoped_lock::~scoped_lock
销毁 reader_writer_lock
对象并释放其构造函数中提供的锁。
~scoped_lock();
reader_writer_lock::scoped_lock_read 类
异常安全 RAII 包装器,可用于以读者身份获取 reader_writer_lock
锁对象。
class scoped_lock_read;
scoped_lock_read::scoped_lock_read
构造 scoped_lock_read
对象,并获取在 _Reader_writer_lock
参数中以读者身份传递的 reader_writer_lock
对象。 如果该锁由另一个线程以编写者身份持有或存在挂起的编写者,则此调用将被阻止。
explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);
参数
_Reader_writer_lock
要以读者身份获取的 reader_writer_lock
对象。
reader_writer_lock::scoped_lock_read::~scoped_lock_read析构函数
销毁 scoped_lock_read
对象并释放其构造函数中提供的锁。
~scoped_lock_read();
try_lock
尝试在无阻塞的情况下以编写者身份获取读写锁。
语法
bool try_lock();
返回值
如果获取了锁,则为值 true
,否则为值 false
。
try_lock_read
尝试在无阻塞的情况下以读者身份获取读写锁。
bool try_lock_read();
返回值
如果获取了锁,则为值 true
,否则为值 false
。
解锁
基于锁定者身份(是读者还是编写者)解锁读写锁。
void unlock();
注解
如果有正在等待锁的编写者,则释放锁的操作将始终由下一个编写者执行(按 FIFO 顺序)。 这种锁偏向编写者,可以让读者在编写者连续的负载下无资源可用。