zoukankan      html  css  js  c++  java
  • Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 Windows线程API还是pthread,或者Macintosh Carbon平台的thread实现。以下只讨论Windows,即使用 BOOST_HAS_WINTHREADS的情况。
    thread类提供了两种构造函数:
    thread::thread()
    thread::thread(const function0<void>& threadfunc)
    第 一种构造函数用于调用GetCurrentThread构造一个当前线程的thread对象,第二种则通过传入一个函数或者一个functor来创建一个 新的线程。第二种情况下,thread类在其构造函数中间接调用CreateThread来创建线程,并将线程句柄保存到成员变量m_thread中,并 执行传入的函数,或执行functor的operator ()方法来启动工作线程。

    我们可以用以下三种方式启动一个新线程:
    1
    、传递一个工作函数来构造一个工作线程

     1 #include <boost/thread/thread.hpp>
     2 #include <boost/thread/mutex.hpp>
     3 #include <iostream>
     4 
     5 boost::mutex io_mutex;
     6 
     7 void count()    // worker function
     8 {
     9     for (int i = 0; i < 10; ++i)
    10     {
    11         boost::mutex::scoped_lock lock(io_mutex);
    12         std::cout << i << std::endl;
    13     }
    14 }
    15 
    16 int main(int argc, char* argv[])
    17 {
    18     boost::thread thrd1(&count);
    19     boost::thread thrd2(&count);
    20     thrd1.join();
    21     thrd2.join();
    22 
    23     return 0;
    24 }
    25 


    2、传递一个functor对象来构造一个工作线程

     1 #include <boost/thread/thread.hpp>
     2 #include <boost/thread/mutex.hpp>
     3 #include <iostream>
     4 
     5 boost::mutex io_mutex;
     6 
     7 struct count
     8 {
     9     count(int id) : id(id) { }
    10 
    11     void operator()()
    12     {
    13         for (int i = 0; i < 10; ++i)
    14         {
    15             boost::mutex::scoped_lock lock(io_mutex);        // lock io, will be explained soon.
    16             std::cout << id << ": " << i << std::endl;
    17         }
    18     }
    19 
    20     int id;
    21 };
    22 
    23 int main(int argc, char* argv[])
    24 {
    25     boost::thread thrd1(count(1));
    26     boost::thread thrd2(count(2));
    27     thrd1.join();
    28     thrd2.join();
    29     return 0;
    30 }
    31 


    3、无需将类设计成一个functor,借助bind来构造functor对象以创建工作线程

     1 #include <boost/thread/thread.hpp>
     2 #include <boost/thread/mutex.hpp>
     3 #include <boost/bind.hpp>
     4 #include <iostream>
     5 
     6 boost::mutex io_mutex;
     7 
     8 struct count
     9 {
    10     static int num;
    11     int id;
    12 
    13     count() : id(num++) {}
    14 
    15     int do_count(int n)
    16     {
    17         for (int i = 0; i < n; ++i)
    18         {
    19             boost::mutex::scoped_lock lock(io_mutex);
    20             std::cout << id << ": " << i << std::endl;
    21         }
    22         return id;
    23     }
    24 };
    25 
    26 int count::num = 1;
    27 
    28 int main(int argc, char* argv[])
    29 {
    30     count c1;
    31     boost::thread thrd1(boost::bind(&count::do_count, &c1, 10));
    32     thrd1.join();
    33     return 0;
    34 }


    其中bind是一个函数模板,它可以根据后面的实例化参数构造出一个functor来,上面的boost::bind(&count::do_count, &c1, 10)其实等价于返回了一个functor:
    struct
     countFunctor
    {

        int
     operator() ()
        {
            (&
    c1)->do_count(10);    // just a hint, not actual code
        }
    };

    因此,以后就跟2中是一样的了。

  • 相关阅读:
    UVA12125 March of the Penguins (最大流+拆点)
    UVA 1317 Concert Hall Scheduling(最小费用最大流)
    UVA10249 The Grand Dinner(最大流)
    UVA1349 Optimal Bus Route Design(KM最佳完美匹配)
    UVA1212 Duopoly(最大流最小割)
    UVA1395 Slim Span(kruskal)
    UVA1045 The Great Wall Game(二分图最佳匹配)
    UVA12168 Cat vs. Dog( 二分图最大独立集)
    hdu3488Tour(KM最佳完美匹配)
    UVA1345 Jamie's Contact Groups(最大流+二分)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3796122.html
Copyright © 2011-2022 走看看