当前位置: 首页>>代码示例>>C++>>正文


C++ queue::run_until_empty方法代码示例

本文整理汇总了C++中queue::run_until_empty方法的典型用法代码示例。如果您正苦于以下问题:C++ queue::run_until_empty方法的具体用法?C++ queue::run_until_empty怎么用?C++ queue::run_until_empty使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在queue的用法示例。


在下文中一共展示了queue::run_until_empty方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: assert

std::vector< coroutine >
queue_to_vec_cor( queue q, event::condition_variable* cv, event::mutex* mt, size_t min )
{
  if ( cv ) {
    assert( mt );
  }

  std::vector< coroutine > cors;

  if ( q.type( ) == queue_type::serial ) {
    if ( cv ) {
      auto func = [ q = std::move( q ), cv, mt, min ]( ) mutable
      {
        for ( size_t i = 0; q.run_once( ); ++i ) {
          if ( i >= min ) {
            boost::lock_guard< event::mutex > lock( *mt );
            cv->notify( );
          }
        }
      };
      cors.emplace_back( std::move( func ) );
    } else {
      auto func = [q = std::move( q )]( ) mutable
      {
        q.run_until_empty( );
      };
      cors.emplace_back( std::move( func ) );
    }
  } else {
    cors.reserve( q.work_queue.size( ) );
    if ( cv ) {
      auto atomic = std::make_shared< std::atomic< size_t > >( 0 );
      for ( auto& work : q.work_queue ) {
        auto func = [ work = std::move( work ), atomic, cv, mt, min ]( ) mutable
        {
          ( *work )( );
          size_t atom_val = ++( *atomic );
          if ( atom_val >= min ) {
            boost::lock_guard< event::mutex > lock( *mt );
            cv->notify( );
          }
        };
        cors.emplace_back( std::move( func ) );
      }
    } else {
      for ( auto& work : q.work_queue ) {
        cors.emplace_back( std::move( work ) );
      }
    }
  }

  return cors;
}
开发者ID:nikux,项目名称:game_engine,代码行数:53,代码来源:global_thr_pool.cpp

示例2: if

void
queue::append_queue( queue q )
{
  boost::lock( queue_mut, q.queue_mut );
  boost::lock_guard< boost::recursive_mutex > my_lock( queue_mut, boost::adopt_lock );
  boost::lock_guard< boost::recursive_mutex > q_lock( q.queue_mut, boost::adopt_lock );

  if ( typ == q.typ ) {
    std::move( q.work_queue.begin( ), q.work_queue.end( ), std::back_inserter( work_queue ) );

  } else if ( typ == queue_type::parallel && q.typ == queue_type::serial ) {
    auto func = [q = std::move( q )]( ) mutable
    {
      q.run_until_empty( );
    };

    work_queue.emplace_back( new spec_functor< decltype( func ) >( std::move( func ) ) );

  } else if ( typ == queue_type::serial && q.typ == queue_type::parallel ) {

    auto func = [q = std::move( q )]( ) mutable
    {
      event::mutex mt;
      event::condition_variable cv;
      boost::unique_lock< event::mutex > lock( mt );

      auto size = q.work_queue.size( );
      schedule_queue_first( std::move( q ), cv, mt, size );
      cv.wait( lock );
    };

    work_queue.emplace_back( new spec_functor< decltype( func ) >( std::move( func ) ) );
  }

  if ( cb_added ) {
    cb_added( *this );
  }
}
开发者ID:nikux,项目名称:game_engine,代码行数:38,代码来源:queue.cpp


注:本文中的queue::run_until_empty方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。