基于锁的并发数据结构设计,需要确保访问线程持有锁的时间最短。对于只有一个互斥量的数据结构来说,需要保证数据不被锁之外的操作所访问到,并且还要保证不会在固有结构上产生条件竞争。但是使用多个互斥量可能会导致死锁。
下面是一个使用锁的的线程安全的数据队列:
1 |
|
互斥量_m能保证基本的线程安全,那就是对每个成员函数进行加锁保护。这就保证在同
一时间内,只有一个线程可以访问到数据,所以能够保证,数据结构的“不变量”被破坏时,不会被其他线程看到。在empty()和pop()成员函数之间会存在潜在的竞争,不过代码会在pop()函数上锁时,显式的查询栈是否为空,所以这里的竞争是非恶性的所有成员函数都使用 st::lock_guard<> 来保护数据,所以队列的成员函数能有“线程安全”的表现。
下面使用条件变量和锁是实现一个线程安全的队列:
1 |
|