【发布时间】:2014-01-24 20:12:25
【问题描述】:
以下代码是一个整数的缓冲区。我试图找到可能导致死锁的多个线程(假设 3 个线程:1 个“消费者”和 2 个“生产者”)执行此代码:
class OneBuf{
Mutex m;
CondVar cv;
int buffer;
bool full;
void put (int data){
m.lock();
while(full) cv.wait(m);
buffer = data;
full = true;
cv.signal();
m.unlock();
}
int get(){
int data;
m.lock();
while(!full) cv.wait(m);
full = false;
data = buffer;
cv.signal();
m.unlock();
return data;
}
}
这是一个练习,我被要求给出一个导致死锁的 3 个线程(1 个消费者和 2 个生产者)的示例。此外,练习表明,如果我将第 12 行和第 22 行替换为 cv.broadcast()(而不是 cv.signal()),我可以避免任何死锁。我希望这会有所帮助。
【问题讨论】:
-
看不到任何明显的死锁该代码的方法(假设 Mutex 和 CondVar 被实现为相应 pthread 调用的 straitforward 包装)。你看到它实际上陷入僵局了吗?
-
@MikeTyukanov 请阅读我在代码下方添加的内容。我希望它有所帮助。
标签: c++ multithreading buffer mutex deadlock