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

 

posted @ 2018-11-23 11:15  代码研究院初心  阅读(278)  评论(0编辑  收藏  举报