0x00 摘要
在分析比特币源码时,最开始就简单学习了一些boost thread的简单用法和最基本的互斥锁,但看到后面发现还用到了更深层次的并发编程知识,于是又回来完整的学习一下,这里做个学习的总结。本文的内容主要包括线程组(Thread group)以及各种互斥锁(lock_guard
, unique_lock
)以及更高级一点的condition variable
。
0x01 Thread Group
Thread group
其实和thread没有太大的区别,就是把线程放到一起使用简单的操作进行批量处理,根据http://www.boost.org/doc/libs/1_53_0/boost/thread/detail/thread_group.hpp,总共有以下几个操作,
- thread* create_thread(F threadfunc); //创建新线程
- void add_thread(thread* thrd); //添加线程
- void remove_thread(thread* thrd); // 删除线程
- void join_all(); // 等待所有线程结束
- void interrupt_all(); // 中断所有线程
- size_t size() const; // 返回线程数量
0x02 Mutex
多线程访问共享变量时,如果不对共享变量做一定的限制,由于线程的随机性,可能就会造成无法预知的结果,而这其中最简单也是目前最常用的方式就是互斥锁,也就是每次只允许一个线程访问,如果已经有一个线程在访问共享变量其他线程再访问时则会进入阻塞状态,从而保证程序的确定性与一致性,一个简单的例子如下,
#include "boost/thread.hpp"
#include <iostream>
using namespace std;
boost::mutex mutex;
int id = 0;
void<