• (十二)boost库之多线程高级特性


    (十二)boost库之多线程高级特性

        很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定义了N中状态,看的让人抓狂。该项目的大体逻辑是这样的,启动K个线程,当线程执行到某一个点时,进行轮训,判断是否所有线程都执行到该点,单独开启了一个线程用于轮训所有线程是否结束,待所有线程结束后会获取数据,生成一个文件,另外还有一个线程就在轮训文件是否生成,然后读取文件进行下一步操作。各种的轮训,显得非常的笨拙。利用boost库,我们来看看这么解决这些同步问题。

    1、获取线程结果

        boost::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果

        unique_future 用于保存异步计算得到的结果

    void GetFutures()
    
    {
    
        boost::packaged_task<int> pt(boost::bind(Fibonacci, 10));
    
        boost::unique_future<int> uf = pt.get_future();
    
        //启动线程,必须使用move,packaged_task是不可拷贝的
    
        boost::thread th(boost::move(pt));
    
        uf.wait();
    
        int nVal = uf.get();
    
        cout << "Fibonacci " << nVal << endl;
    
    }

    uf.wait等待线程结束,当然future类也提供了很多种等待函数,如timed_wait等待一段时间。

    当然,我们更多的时候是等待一组线程的结束,这是可以用wait_for_all等待所有future对象,wait_for_any 等待任意一个对象接收。

    void GetFutures()
    
    {
    
        boost::packaged_task<int> pt1(boost::bind(Fibonacci, 10));
    
        boost::packaged_task<int> pt2(boost::bind(Fibonacci, 20));
    
        boost::unique_future<int> uf1 = pt1.get_future();
    
        boost::unique_future<int> uf2 = pt2.get_future();
    
        boost::thread(boost::move(pt1));
    
        boost::thread(boost::move(pt2));
    
        boost::wait_for_all(uf1, uf2);
    
        cout << "Fibonacci " << uf1.get() << " ," << uf2.get() << endl;
    
    }

    2、护栏barrier

    护栏就是说要等待所有的线程到达同一个点,才继续往下执行。

    boost::barrier br(3);
    
    void BarrierFunc()
    
    {
    
        cout << "begin" << endl;
    
        br.wait();
    
        cout << "end " << endl;
    
    }
    
    
    
    void TestBarrier()
    
    {
    
        boost::thread_group grp;
    
        grp.create_thread(BarrierFunc);
    
        grp.create_thread(BarrierFunc);
    
        grp.create_thread(BarrierFunc);
    
        grp.join_all();
    
    }

    3、线程本地存储

    程序中使用全局变量或局部静态变量,这是非常常见的,但这样的函数对多线程程序来说,很难保证程序的正确性,这时我们希望,这些全局变量和局部静态变量,是线程独立拥有的,多个线程之间不会造成干扰,那么使用thread_specific_ptr就能轻松解决。

    int Add(int n)
    
    {
    
        static boost::thread_specific_ptr<int> sp;  //该变量是线程独立拥有的
    
        if (!sp.get())
    
        {
    
            sp.reset(new int(0));
    
        }
    
        *sp = n + *sp;
    
        return *sp;
    
    }
    
    
    
    void  Sum()
    
    {
    
        cout <<  Add(5) + Add(10) << endl;           //得到的结果20
    
    }
    
    
    
    void ThreadSum()
    
    {
    
        boost::thread_group threads;    
    
        for (int i=0; i<5; ++i)
    
            threads.create_thread(&Sum);             //所有线程输出的结果是一样的
    
        threads.join_all();
    
    }
  • 相关阅读:
    python中zip函数
    python中创建列表、元组、字符串、字典
    python中enumerate函数
    python中字符串的拼接
    python中格式化浮点数及科学计数法
    python中tuple函数
    python中可迭代对象的排序
    python中变量类型转换
    python中可迭代对象反转
    python中list函数
  • 原文地址:https://www.cnblogs.com/timssd/p/5544684.html
Copyright © 2020-2023  润新知