bob*_*obo 4 c++ multithreading stl thread-safety
我需要几个STL容器,线程安全.
基本上我以为我只需要为每个STL容器对象添加2个方法,
.lock()
.unlock()
Run Code Online (Sandbox Code Playgroud)
我也可以打破它
.lockForReading()
.unlockForReading()
.lockForWriting()
.unlockForWriting()
Run Code Online (Sandbox Code Playgroud)
可行的方法是可以接受任意数量的并行读取锁,但如果有写入锁,则会阻止读取和写入.
尝试锁定写入等待直到lockForReading信号量降为0.
有没有标准的方法来做到这一点?
我是如何计划做错的或短视的?
执行此操作的标准方法是获取构造函数中的锁,并在析构函数中释放它.这通常称为资源获取初始化或RAII.我强烈建议你使用这种方法而不是
.lock()
.unlock()
Run Code Online (Sandbox Code Playgroud)
这不是例外安全.您可以在投掷之前轻松忘记解锁互斥锁,从而在下次尝试锁定时导致死锁.
Boost.Thread库中有几种同步类型对您有用,特别是 boost::mutex::scoped_lock.对于您希望从多个线程访问的任何容器添加lock()和unlock()方法,我建议您在访问容器时使用boost:mutex或等效并实例化a boost::mutex::scoped_lock.
这真的很糟糕.外部代码无法识别或理解您的线程语义,容器中对象的别名易用性使它们成为可靠的线程安全接口.
线程安全发生在设计时.你不能通过在问题上抛出锁来解决线程安全问题.通过不让两个线程同时写入相同的数据来解决线程安全问题 - 当然,在一般情况下.但是,除直接线程同步原语外,处理线程安全不是特定对象的责任.
您可以拥有并发容器,旨在允许并发使用.然而,它们的接口极大地由标准集装箱提供什么不同了.例如,容器中对象的别名较少,并且每个单独的操作都被封装.
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |