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();