Zis*_*Zis 1 c++ multithreading mutex
我正在尝试实现一个多入多出的线程间通道类。我有三个互斥锁:full缓冲区已满时锁定。empty当缓冲区为空时锁定。th当其他人正在修改缓冲区时锁定。我的单个 IO 程序看起来像
operator<<(...){
full.lock() // locks when trying to push to full buffer
full.unlock() // either it's locked or not, unlock it
th.lock()
...
empty.unlock() // it won't be empty
if(...)full.lock() // it might be full
th.unlock()
operator>>(...){
// symmetric
}
Run Code Online (Sandbox Code Playgroud)
这对于单个 IO 完全适用。但是对于多个 IO,当消费者线程解锁时full,所有提供者线程都会关闭,只有一个会获取th并且缓冲区可能会因为单个线程而再次变满,而不再进行完整检查。我full.lock()当然可以再次添加,但这是无止境的。反正是有锁full,并th在同一时间?我确实看到了一个类似的问题,但我没有看到这里的问题是订单。
是的,使用std::lock(full , th);,这可以避免一些死锁
例如:线程1:
full.lock();
th.lock();
Run Code Online (Sandbox Code Playgroud)
线程2:
th.lock();
full.lock();
Run Code Online (Sandbox Code Playgroud)
这可能会导致死锁,但以下不会:
线程1:
std::lock(full, th);
Run Code Online (Sandbox Code Playgroud)
线程2:
std::lock(th, full);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3388 次 |
| 最近记录: |