2016-02-26 58 views
0

我创建了一个简单的“SharedQueue”类,它由2个线程访问 - 一个插入数据,另一个接收数据。在这个例子中,它拥有int s,但它将被扩展成为模板类,因此它可以容纳所有内容。C++ - 简单SharedQueue是互斥体必需的?

internalQueue只是一个std::queue<int>qMtx是一个std::mutex

下面实现的一部分:

size_t SharedQueue::size() const 
{ 
    return internalQueue.size(); 
} 

bool SharedQueue::empty() const 
{ 
    return internalQueue.empty(); 
} 

int SharedQueue::front() 
{ 
    int retVal; 
    qMtx.lock(); 
    retVal = internalQueue.front(); 
    qMtx.unlock(); 
    return retVal; 
} 

void SharedQueue::push(const int& val) 
{ 
    qMtx.lock(); 
    internalQueue.push(val); 
    qMtx.unlock(); 
} 

void SharedQueue::push(int&& val) 
{ 
    qMtx.lock(); 
    internalQueue.push(val); 
    qMtx.unlock(); 
} 

void SharedQueue::pop() 
{ 
    qMtx.lock(); 
    internalQueue.pop(); 
    qMtx.unlock(); 
} 

我的问题是:
我需要调用诸如size()empty()方法时锁定互斥?

我试图找到任何队列多线程的例子,但它没有回答我的问题。

+1

您必须问自己在并发场景中size()和empty()是什么意思。 – juanchopanza

+0

如果情况是这样的:如果为空 - >等待5秒,否则立即处理里面的内容然后它需要锁定。这是你的意思@juanchopanza? – lewiatan

+0

我的意思是说,它可以是空的,当你问,并立即变得不空,所以调用'empty()'的结果是不是很有用。和size()一样。您必须锁定呼叫以及使用呼叫结果的所有代码。 – juanchopanza

回答

2

您还必须保护这些功能。你不知道size()或empty()会做什么。这些功能不能保证原子性。

的实现可以自由选择确定大小()和空()的任何固定时间的解决方案,但这并不意味着某处有必须是一个计数器,它“可能”具有半原子行为。

+0

即使他们受到保护,他们也没有多大用处。 – juanchopanza