我看这本书真的是云里雾里的,尤其是中文版,感觉真的是,一言难尽,建议可以去看看muduo那本书
在这里记录一下,里面常用的出现的并发编程中可能会使用到的函数
一.std::thread::hardware_concurrency() 函数
这个函数可以返回硬件线程所支持的最大上下文的数量
头文件 是
#include < thread>
std::cout << "thread number " << std::thread::hardware_concurrency() << std::endl;
二.std::lock_guard函数和std::unqiue_lock函数
这种方式是以RAII的方式对于线程来进行加锁和解锁,函数析够的时候自动析够,保证线程能够正确被解锁
std::lock——可以一次性锁住多个(两个以上)的互斥量,并且没有副作用(死锁风险)。
std::lock_guard 和 std::unique_lock 两者功能基本相同,unique更为灵活,unique中提供了lock,unlock等函数,可以在等待中重新上锁
template <class Mutex> class lock_guard;
在 lock_guard 对象构造时,传入的 Mutex 对象(即它所管理的 Mutex 对象)会被当前线程锁住。在lock_guard 对象被析构时,它所管理的 Mutex 对象会自动解锁,由于不需要程序员手动调用 lock 和 unlock 对 Mutex 进行上锁和解锁操作,因此这也是最简单安全的上锁和解锁方式,尤其是在程序抛出异常后先前已被上锁的 Mutex 对象可以正确进行解锁操作,极大地简化了程序员编写与 Mutex 相关的异常处理代码。
在lock_guard对象的生命周期内,它所管理的对象对一直保持上锁,随着它的析够,对象将会解锁
-
lock_guard 构造函数如下表所示:
locking (1) explicit lock_guard (mutex_type& m); adopting(2) lock_guard (mutex_type& m, adopt_lock_t tag); copy[deleted](3) lock_guard (const lock_guard&) = delete;
locking 初始化
lock_guard 对象管理 Mutex 对象 m,并在构造时对 m 进行上锁(调用 m.lock())。
adopting初始化
lock_guard 对象管理 Mutex 对象 m,与 locking 初始化(1) 不同的是, Mutex 对象 m 已被当前线程锁住。
void add_to_list(int new_value)
{
std::lock_guard<std::mutex> guard(some_mutex); //线程安全
some_list.push_back(new_va