C++:如何使用 thread_local 声明指针变量?

标签 c++ c++11 pointers thread-local-storage

我试图声明 thread_local 指针变量,然后在一个线程中指向一个新对象。

thread_local static A* s_a = nullptr;

好像线程销毁的时候新对象的内存没有释放。我也尝试使用 unique_ptr,但仍然存在内存泄漏。我正在使用 VS 2015。

这是代码。在return 0处加个断点,查看进程的内存,会发现内存增加了很多。

#include "stdafx.h"

#include <iostream>
#include <thread>

class A
{
public:
    A(const std::string& name) : name_(name) { std::cout << (name_ + "::A").c_str() << std::endl; }
    ~A() { std::cout << (name_ + "::~A").c_str() << std::endl; }

    const std::string& name(){ return name_; }
private:
    std::string name_;
};

thread_local static std::unique_ptr<A> s_a;
//thread_local static A* s_a = nullptr;

static void test(const std::string& name)
{
    //A a(name);
    if(!s_a)
        s_a.reset(new A(name));
        //s_a = new A(name);
}

int main()
{
    for (size_t i = 0; i < 10000; i++)
    {
        {
            std::thread t0(test, "t0");
            std::thread t1(test, "t1");
            t0.join();
            t1.join();
        }
    }
    return 0;
}

我的问题是如何使用 thread_local 以正确的方式声明指针变量?

谢谢。

最佳答案

标准对线程的支持非常基础

Boost 的跨平台支持当然更胜一筹:

// for thread_specific_ptr
#include <boost/thread/tss.hpp>


// define a deleter for As
void destroy_a(A* ptr) noexcept
{
    delete ptr;
}

// define the thread_specific pointer with a deleter
boost::thread_specific_ptr<A> s_a { &destroy_a };


static void test(const std::string& name)
{
    // create the object in a manner compatible with the deleter
    if(!s_a.get())
    {
        s_a.reset(new A(name));
    }
}

关于C++:如何使用 thread_local 声明指针变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429861/

相关文章:

c++ - 存储一组指针会导致未定义的行为吗?

pointers - 如何使用reflect获取指针的底层类型?

c++ - 如何在不使指向它的指针失效的情况下增加缓冲区?

c++ - 通过最大跳跃长度数组的最短路径

c++ - 在模板参数的方法中添加类型转换时出现 clang 错误

c++ - 我如何处理这种情况 C++ sizeof 问题

c++ - 可变参数模板和动态转换

c - 为什么我收到警告 : (near initialization for ‘ptr’ ) and segmentation fault at runtime when accsessing value at pointer?

c++ - 应该在策略模式中使用安全指针吗?

android - 适用于 Android 的 C++ Builder WSDL 客户端