• boost::thread boost库线程


    一.boost::thread的创建

      1.线程创建方法一:

        boost::shared_ptr<boost::thread> writeThread_;

        boost::function0<void> f = boost::bind(&DBTaskMgr::execute, this);

        writeThread_ = boost::shared_ptr<boost::thread>(new boost::thread(f));

      2.线程创建方法二:

        boost::thread myThread(threadFun);  //函数无参数,并返回void类型

      3.放弃时间片: 

        boost::thread::yield();

        当前线程放弃余下的时间片。

      4.等待一个线程:

        myThread.join();

        注:调用这个方法的线程进入wait状态,直到myThread代表的线程完成为止。如果它不结束的话,join方法就不会返回。join是一个等待子线程结束的最好的方法。

          如果主程序不调用join方法而直接结束,它的子线程有可能没有执行完成,但是所有的子线程也随之退出。不调用join方法,主线程就不会等待它的子线程。

    二.从一个线程中给另一个线程发送通知

       当需要线程等待某个事物时,可以创建一个condition对象,然后通过这个对象来通知那些等待的线程。

      #include <iostream>

      #include <boost/thread/thread.hpp>

      #include <boost/thread/condition.hpp>

      #include <boost/thread/mutex.hpp>

      

      boost::shared_ptr<boost::thread> writeThread_;

      boost::mutex taskMutex_;

      boost::condition_variable taskCond;

      bool taskReady = false;

      while(true)
      {
        {
          boost::unique_lock<boost::mutex> lock(taskMutex_); //锁定taskMutex_对象
          while (!taskReady)
          {
            taskCond.wait(lock); //解开这个taskMutex_上的锁,然后进行等待或者休眠,直到它的条件得到了满足
          }
          taskReady = false;

        }

          ...............................................

          ......
      }

      

      

      void DBTaskMgr::enqueueTask(IDBTask * task)
      {
        taskQueMutex_.lock();
        taskQue_.push_back(task);
        taskQueMutex_.unlock();

        

        {
          boost::unique_lock<boost::mutex> lock(taskMutex_);
          taskReady = true;
        }

        taskCond.notify_one(); //解除线程等待或休眠

        //taskCond.notify_all(); //解开所有线程等待或休眠

      }

      .....................................

  • 相关阅读:
    [labuladong算法小抄]如何判断回文链表
    [PHP]json_encode中文JSON_UNESCAPED_UNICODE在php5.3返回null
    [javascript] 使用javascript实现webrtc视频聊天demo
    [Linux] grep查找文本时反斜杠转义问题
    [css] 使用css画文件夹icon和话筒icon
    [Go] 开源客服系统以及多商户客服系统-GOFLY在线客服
    [javascript] vue和elementui中的键盘事件
    Elasticsearch 学习之不停止服务,完成升级重启维护操作
    unassigned_shards一直无法分配
    Jenkins+Gradle实现打包时自定义项
  • 原文地址:https://www.cnblogs.com/wuchunming/p/3793419.html
Copyright © 2020-2023  润新知