zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    关于TCP/IP协议栈
    关于java socket
    批处理的高吞吐率和高延迟的解释
    关于Xmanager使用问题的总结
    关于Storm Stream grouping
    django url 传递多个参数
    多线程 python threading 信号量/递归锁
    多线程 python threading 简单锁/互斥锁
    django 1.9 wsgi + nginx
    django models ForeignKey Many-to-ManyField 操作
  • 原文地址:https://www.cnblogs.com/anlg-dongxh/p/10006352.html
Copyright © 2011-2022 走看看