将生产消费模式引入mod_esl_json模块

2018-08-05  本文已影响13人  XDgbh
int loop_flag = 1;
datatype json_data;
while(loop_flag)
{
    json_data = recv_json();  //生产者,在别处定义声明
    if(json_data)
    {
        parse_json( json_data );  //消费者,在别处定义声明
    }
}

解决办法——引入缓冲队列,合理使用生产消费模式

生产者消费者模式架构
int loop_flag = 1;    //全局变量
queue<datatype> q_json_datas;  //生产者和消费者两线程共享的数据
mutex mtx;  //互斥量,用来对多线程共享数据加锁

//生产者线程执行函数,内有while循环保持线程不结束
void Producer()
{
  while(loop_flag)
  {
    datatype json_data;
    json_data = recv_json();  //生产者,在别处定义声明
    if(json_data && !队列满)
    {
        mtx.lock();  //线程访问共享数据要加锁
        q_json_datas.push( json_data );  //生产的数据先保存到缓冲队列
        mtx.unlock();  // 使用完解锁
    }
  }
}

//创建一个单独的消费者线程
void Consumer()
{
   //也使用一个while循环检查队列中是否还有未处理的数据,阻塞线程不结束
  while(loop_flag)    
  {
    if( !q_json_datas.empty())
    {
        mtx.lock();  //线程访问共享数据要加锁
        datatype json_data2 = q_json_datas.front();  //从队列中获取数据
        q_json_datas.pop();  //将已消费的数据从队列中清除
        mtx.unlock();
        parse_json( json_data2 );  //消费者,在别处定义声明 
    }
  }
}

int main()
{
    thread t1( &Producer );  //创建一个子线程来作为生产者   
    thread t2( &Consumer );  //创建一个子线程来作为消费者
}



上一篇 下一篇

猜你喜欢

热点阅读