并发

作者: 镜中无我 | 来源:发表于2019-10-19 11:16 被阅读0次
  • 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

相关文章

网友评论

      本文标题:并发

      本文链接:https://www.haomeiwen.com/subject/xjiiaqtx.html