博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost thread的用法
阅读量:4192 次
发布时间:2019-05-26

本文共 3032 字,大约阅读时间需要 10 分钟。

 

Boost::Thread的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的线程选项的不同,分别决定使用Windows线程API,pThread,或Mac平台的thread实现。以下只讨论Windows,即使用BOOST_HAS_WINTHREAD的情况。

Boost::Thread有两个构造函数:一个是thread(),构造一个表示当前执行线程的线程对象;一个是explicit thread(const boost::function0<void>& threadfunc),这里的boost::function0<void>可以简单看为一个无返回无参数的函数。这里的函数可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,可以看下面的几个例子。

(1)最简单方法

 

[cpp]  

#include <boost/thread/thread.hpp>  

#include <iostream>  

  

void hello()  

{  

    std::cout<<"Hello world, I'm a thread!"<<std::endl;  

}  

  

int main()  

{  

    boost::thread thrd(&hello);  

    thrd.join();  

  

    system("pause");  

    return 0;  

}  

 

(2)复杂类型对象作为参数来创建线程

 

[cpp]  

#include <boost/thread/thread.hpp>  

#include <boost/thread/mutex.hpp>  

#include <iostream>  

  

boost::mutex io_mutex;  

  

struct count  

{  

    count(int id) : id(id) {}  

  

    void operator()()  

    {  

        for(int i = 0; i < 10; ++i)  

        {  

            boost::mutex::scoped_lock lock(io_mutex);  

            std::cout<<id<<": "<<i<<std::endl;  

        }  

    }  

  

    int id;  

};  

  

int main()  

{  

    boost::thread thrd1(count(1));  

    boost::thread thrd2(count(2));  

    thrd1.join();  

    thrd2.join();  

  

    system("pause");  

    return 0;  

}  

 

(3)在类内部创建线程

类内部静态方法启动线程

 

[cpp]  

#include <boost/thread/thread.hpp>  

#include <iostream>  

  

class HelloWorld  

{  

public:  

    static void hello()  

    {  

        std::cout<<"Hello world, I'm a thread!"<<std::endl;  

    }  

    static void start()  

    {  

        boost::thread thrd(hello);  

        thrd.join();  

    }  

};  

  

int main()  

{  

    HelloWorld::start();  

  

    system("pause");  

    return 0;  

}  

在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:

 

 

[cpp]  

#include <boost/function/function0.hpp>  

#include <boost/thread/thread.hpp>  

#include <iostream>  

  

class HelloWorld  

{  

public:  

    void hello()  

    {  

        std::cout<<"Hello world, I'm a thread!"<<std::endl;  

    }  

    void start()  

    {  

        boost::function0<void> f = boost::bind(&HelloWorld::hello, this);  

        boost::thread thrd(f);  

        thrd.join();  

    }  

};  

  

int main()  

{  

    HelloWorld hello;  

    hello.start();  

  

    system("pause");  

    return 0;  

}  

(3)在Singleton模式内部创建线程:

 

[cpp]  

#include <boost/thread/thread.hpp>  

#include <iostream>  

  

class HelloWorld  

{  

public:  

    void hello()  

    {  

        std::cout<<"Hello world, I'm a thread!"<<std::endl;  

    }  

    static void start()  

    {  

        boost::thread thrd(boost::bind(&HelloWorld::hello, &HelloWorld::getInstance()));  

        thrd.join();  

    }  

    static HelloWorld& getInstance()  

    {  

        if(!instance)  

            instance = new HelloWorld;  

        return *instance;  

    }  

private:  

    HelloWorld() {}  

    static HelloWorld* instance;  

};  

  

HelloWorld* HelloWorld::instance = 0;  

int main()  

{  

    HelloWorld::start();  

  

    system("pause");  

    return 0;  

}  

(4)用类内部函数在类外部创建线程

 

 

[cpp]  

#include <boost/thread/thread.hpp>  

#include <iostream>  

#include <string>  

  

class HelloWorld  

{  

public:  

    void hello(const std::string& str)  

    {  

        std::cout<<str<<std::endl;  

    }  

};  

  

int main()  

{  

    HelloWorld obj;  

    boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!"));  

    thrd.join();  

  

    system("pause");  

    return 0;  

}  

 

[cpp]  

  1. 如果需要绑定的函数有参数则需要使用boost::bind。比如想使用boost::thread创建一个线程来执行函数void f(int i),如果这样写boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的函数,而且不提供参数f也无法运行,这时就可以写boost::thread thrd(boost::bind(f, 1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用。  

参考:

 

 

转载地址:http://kuloi.baihongyu.com/

你可能感兴趣的文章
亚洲新首富出炉!富豪榜单大洗牌,马云3年来首次跌出中国前三
查看>>
沃尔沃XC40纯电版官宣降价至29.9万元起
查看>>
董明珠:建议个税起征点提高到一万元
查看>>
魅族预热魅族18系列:没有中杯 大杯起步
查看>>
百度吉利成立的汽车公司名称曝光,百度持股55%
查看>>
昆仑万维14亿收购音频社交平台Star Group 60%股权 周亚辉获益超10亿元
查看>>
蔚来已开始部署第二代换电站 最大容量13块电池
查看>>
3月4日见!Redmi Note 10系列屏幕升级:首次采用Super AMOLED屏
查看>>
传网易云音乐高管变动:市场副总裁李茵离职 CEO被降权
查看>>
最高法明确:未成年直播打赏可退还
查看>>
最便宜的骁龙888旗舰机!realme真我GT正式发布:2799元起售
查看>>
市监总局对橙心优选等五家社区团购不正当价格行为作出行政处罚
查看>>
“电视剧女主睡在我家床”案一审判决,出品方赔惨,但判决结果惹争议?
查看>>
三年白干!程序员因违反《竞业协议》赔偿腾讯97.6万元,返还15.8万元
查看>>
中芯国际:与阿斯麦集团签订购买单 总价12亿美元
查看>>
SpaceX星舰飞船首次试飞成功着陆!但没想到还是爆炸了...
查看>>
苹果2021年WWDC大会可能继续采用线上方式举办
查看>>
苹果推出iCloud照片转移服务 能轻松转到谷歌相册
查看>>
RedmiK40系列首销5分钟破30万台 旗舰焊门员实至名归
查看>>
“跨界养猪”这件事,华为正式回应了
查看>>