Boost執行緒處理機制
採自文章:https://www.cnblogs.com/renyuan/p/6613638.html
大多數共享資料的執行緒均採用
boost::mutex mtx;
boost::condition_variable condition;
boost::thread consume_thread; 三者相互配合
1:新增資料的時候採用互斥鎖,鎖住共享資料
queue( Queue& queue, const Entry& e )
{
boost::mutex::scoped_lock lock( mtx );
auto queue_size = queue.size();
if( queue_size > max_queue_size ) {
lock.unlock();
condition.notify_one();
queue_sleep_time += 10;
if( queue_sleep_time > 1000 )
wlog("queue size: ${q}", ("q", queue_size));
boost::this_thread::sleep_for( boost::chrono::milliseconds( queue_sleep_time ));
lock.lock();
} else {
queue_sleep_time -= 10;
if( queue_sleep_time < 0 ) queue_sleep_time = 0;
}
queue.emplace_back( e );
lock.unlock();
condition.notify_one();
}
2:讀取資料的時候也要使用互斥鎖鎖住共享資料,用condition條件變數進行等待相互執行處理
條件變數的使用總是和互斥體及共享資源聯絡在一起的。執行緒首先鎖住互斥體,然後檢驗共享資源的狀態是否處於可使用的狀態。如果不是,那麼執行緒就要等待條件變數。要指向這樣的操作就必須在等待的時候將互斥體解鎖,以便其他執行緒可以訪問共享資源並改變其狀態。它還得保證從等到得執行緒返回時互斥體是被上鎖得。當另一個執行緒改變了共享資源的狀態時,它就要通知正在等待條件變數得執行緒,並將之返回等待的執行緒。
while (true) {
boost::mutex::scoped_lock lock(mtx);
while ( transaction_metadata_queue.empty() &&
transaction_trace_queue.empty() &&
block_state_queue.empty() &&
irreversible_block_state_queue.empty() &&
!done ) {
condition.wait(lock);
lock.unlock();
}
3: 建立執行緒
consume_thread = boost::thread([this] { consume_blocks(); });
4:釋放資源
condition.notify_one();
consume_thread.join();