互斥元:
C++提供了std::mutex;调用lock()来锁定;调用unlock()解锁。
作为替代,提供了身体都std::lock_guard类模板,实现互斥元的RAII管用语法,在构造时锁定互斥元,在析构时将互斥元解锁。
std::unique_lock比std::lock_guard提供了更多的灵活性。
数据竞争:
C++标准库提供了std::once_flag 和std::call_once来处理这种情况~!
std::shared_ptr <some_resource> resource_ptr;
std::once_flag resource_flag;
void init_resource()
{
resource_ptr.reset(new some_resource);
}
void foo()
{
std::once_call(resource_flag, int_resource);
resource_ptr->do_something()
}
条件变量
C++ <condition_variable>提供两个条件变量: std::condition_variable 和std::condition_variable_any。
std::condition_variable仅限于和std::mutex一起工作。
std::condition_variable_any可以与符合成为类似互斥元的最低标准的任何东西一起工作。
wait()、wait_for() 等待条件。
使用future等待一次性事件;如果等待线程只打算等待一次,那么当条件为true时他就不会在等待这个条件变量,条件变量未必时同步机制的最佳选择。
future为一行事件建模。如果一个线程需要等待特定的一次性事件,那么他就会获取一个future来代表这一事件。
std::async来启动一个异步任务,std::async返回一个std::future对象; std::future对象最终将持有函数的返回值,执行get(), 线程就会阻塞直到future就绪,然后返回该值。