在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,linux
下常见的线程同步的方法有下面几种:
这篇博客只介绍互斥量和条件变量的使用。
通常情况下,互斥锁和条件变量是配合使用的,互斥锁用于短期锁定,主要保证线程对临界区的进入;条件变量用于线程长期等待,在wait的时候会释放锁。操作的API如下所示(介绍最常用的):
std::mutex
: 独占的互斥量,不能递归使用 std::condition_variable
:条件变量,配合 std::unique<std::mutex>
进行wait操作。 std::condition_variable_any
和任意带有lock,unlock
的mutex配合使用,但是效率比std::condition_variable
差。
举个栗子:
10个人排队使用打印机,任一时刻只有一个人能使用。用一个变量i
的0
和1
两种状态分别表示打印机能不能使用。这个程序这样写,详细解释见注释:
测试情况应该是:每个进程输出的i
都为0
,表示每个进程都在合理的使用打印机,没有出现同时使用的情况,即i < 0
的情况。
$ g++ condition.cpp -pthread //注意链接pthread
嗯,可见我们的使用姿势是正确的~
新闻热点
疑难解答
图片精选