c++11 future 与 thread_local 的问题

#pragma once

#include <iostream>
#include <thread>
#include <vector>
#include <memory>
#include <future>

using std::cout;
using std::endl;

class Test_threadLocal
{
    typedef Test_threadLocal self_type;

    class ThreadLocalData
    {
    public:
        ThreadLocalData()
        {
            cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << endl;
        }

        ~ThreadLocalData()
        {
            cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << endl;
        }
    };

private:
    bool entry()
    {
         thread_local ThreadLocalData data;
         return true;
    }

    void runWithThread()
    {     
        cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << " begin ******************************" << endl;
        std::vector<std::shared_ptr<std::thread>> threadGroup;
        const int threadCount = 5;
        for (int i = 0; i < threadCount; ++i)
        {
            std::shared_ptr<std::thread> t(new std::thread(&self_type::entry,this));
            threadGroup.push_back(t);
        }

        for (int i = 0; i < threadCount; ++i)
        {
            threadGroup[i]->join();
        }

        cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << " end ******************************" << endl;
        int a = 5;
        ++a;
    }

    void runWithFuture()
    {
        cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << " begin ******************************" << endl;
        std::vector< std::future<bool> > futureList;
        const int threadCount = 5;
        for (int i = 0; i < threadCount; ++i)
        {
            futureList.push_back(std::async(std::launch::async, &self_type::entry, this));
        }

        bool bSuccess = true;
        for (auto& f : futureList)
        {
            bool rtn = f.get();
            cout << "rtn:" << rtn << endl;
        }

        cout << __FUNCTION__ << " threadId:" << std::this_thread::get_id() << " end ******************************" << endl;
        int a = 5;
        ++a;
    }

public:
    static void test()
    {
        self_type obj;
        obj.runWithThread();
        obj.runWithFuture();
    }
};

发现: runWithThread执行完毕后,正常调用 ThreadLocalData 析构函数

            runWithFuture执行完毕后,并未调用 ThreadLocalData 析构函数 (这是个问题)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值