我在一個linux應用程序中使用Boost 1.41,它在一個線程上接收數據並將其保存在一個隊列中,另一個線程將其從隊列中彈出並處理它。爲了使線程安全,我使用了作用域鎖。Boost範圍鎖定斷言失敗
我的問題是極少的鎖定功能與信息讀取功能失敗:「!pthread_mutext_lock(&米)」
無效的boost ::互斥鎖::()斷言失敗
這是非常罕見的,在最後一次運行中,在發生故障之前花了36小時(約425萬筆交易)。讀取和寫入功能如下表所示,它總是在斷言出現讀取功能
寫入隊列從隊列中讀取
void PacketForwarder::Enqueue(const byte_string& newPacket, long sequenceId)
{
try
{
boost::mutex::scoped_lock theScopedLock(pktQueueLock);
queueItem itm(newPacket,sequenceId);
packetQueue.push(itm);
if (IsConnecting() && packetQueue.size() > MaximumQueueSize)
{
// Reached maximum queue size while client unavailable; popping.
packetQueue.pop();
}
}
catch(...)
{
std::cout << name << " Exception was caught:" << std::endl;
}
}
while (shouldRun)
{
try
{
if (clientSetsHaveChanged)
{
tryConnect();
}
size_t size = packetQueue.size();
if (size > 0)
{
byte_string packet;
boost::mutex::scoped_lock theQLock(pktQueueLock);
queueItem itm = packetQueue.front();
packet = itm.data;
packetQueue.pop();
BytesSent += packet.size();
trySend(packet);
}
else
{
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
}
}
catch (...)
{
cout << name << " Other exception in send packet" << endl;
}
我已經在銷燬scoped_locks時發現了一些問題,但沒有發現無法獲得鎖定。我還通過增強版發佈筆記和Trac日誌進行了搜索,以查看這是否被其他人識別爲問題。我認爲我的代碼非常簡單,但顯然有些事情已經到來。有什麼想法嗎? TIA 保羅
有兩件事:1)boost 1.41已經很老了,你可能想看看更新是否能解決問題; 2)你可以修改具有assert的區域,以便記錄從'pthread_mutex_lock()'返回的值,這可能會給出問題的線索。 – 2014-10-08 17:08:27
是否只有一個全局'pktQueueLock'?另外,在不保存'pktQueueLock'的情況下調用'packetQueue.size()'是否安全? – dohashi 2014-10-08 17:10:24
可能與你的問題無關,你的代碼似乎也對不需要鎖的操作持有鎖,例如writer中的queueItem itm(newPacket,sequenceId)和讀者中的trySend(packet);' (除非有多個閱讀器線程並且發送需要按順序進行)。 – 2014-10-08 17:14:33