- c++11线程接口std::thread
- 构造方式 thread()
default (1)
thread() noexcept;
initialization (2)
template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
copy [deleted] (3)
thread (const thread&) = delete;
move (4)
thread (thread&& x) noexcept;
注意,构造方法中的函数可以是,某个实例的成员函数,这时实例位于第二个参数的位置,也可以是lamba表达式,函数为右值引用,参数和函数的引用类型一致,如果传入的是对象引用,需要使用ref(对象进行转化)
- join():该函数可以阻塞等待线程结束,然后回收资源,被回收的线程必须是joinable的
- detach():将线程分离出去,资源在线程结束时自动回收,注意detach只是规定的线程资源不由其他线程回收,但是一旦主线程exit后,子线程任然会被销毁,可以用pthread_exit结束主线程,同时等待所有资源释放后再销毁子线程
- unique_lock和lock_guard的区别
前者实现更为复杂,使用起来更为灵活,特别是和带条件(condition_variable)的锁时能够设置终结条件,如句法:cond_.wait(lk, [this]{return !que_.empety();});如生产消费队列中的实现
- 读写锁(用于共享资源更新不频繁但是访问频繁的情况)在boost有具体实现
- volatile能保证变量读取和设置的原子性,是因为加入了内存屏障(每一次写操作都必须更新到内存,而不是带有优化的保存在寄存器中),确保cpu操作对变量的绝对更新(特别是写操作),而自增操作是复合操作不能保证原子性。可以对其加同步锁或者使用atomic变量来完成规定的包括自增在内的原子操作(这个方法主要采取一种叫CAS的机制,也就是compareandset,通过循环检验当前变量有没有被污染来确保操作的安全性)
- 单个cpu的volatile自增不会有安全性问题,多核或者多cpu内存屏障发挥了巨大作用,保证在内存中的是最后一次写操作的值
CAS参数:内存位置,旧的预期值,新值
特点:无限循环,需要消耗部分CPU性能,CPU原子指令CompareAndSet
网友评论