C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而且C++程序的可移植性也得到了有力的保证。
互斥量(Mutex)
互斥量提供了独占所有权的概念,它可以帮助程序控制对资源的访问。
一个简单的例子如下,它展示了 std::mutex
能如何用于保护共享于二个线程间的 std::map
:
1 |
|
输出为:
1 | http://bar => fake content |
信号量(Semaphore)
信号量是一个计数器,它限制了并发访问同一资源的线程数量。
在创建信号量时计数器的值总是在0和最大值之间。当计数器的值严格大于0时,对Wait()
的调用会立刻返回,并且计数器的值减一;当计数器的值为0时,对Wait()
的调用会阻塞。对于阻塞的信号量,只有Signal()
调用后,计数器的值重新大于0时才返回。
简单来说,信号量适用场景非常典型——同一时刻只有固定数量消费者访问共享资源。举个栗子,信号量可以表示一个酒店可预订房间数,房间被预定代表一次对信号量Wait()
的调用,而退房的操作即是对Signal()
的调用。
1 |
|
下面是一些测试。
1 | //io操作锁 |
输出为:
1 | //每个线程相隔一秒,即一次只允许一个线程访问。 |