什么时候会有人将std::vector定义为thread_local



std::vector声明为thread_local有什么好处吗?像

static unique_ptr<std::vector<ObjectA>> vecVariable;

std::vector声明为thread_local并不会使pop_back()erase()的操作同步。

在每个STL容器中,如果有一个线程修改容器,那么就没有并发线程读写同一个容器,所以我不能在并发/多线程环境中对vector对象执行erase()pop_back()

即使我声明vector为thread_local,我的代码也会在其中一个操作中崩溃。我知道我可能需要在锁定下执行这些操作,但我只是想了解何时有人会将std::vector定义为thread_local ?

thread_local不是用来同步的。它的意思是作为存储持续时间说明符(http://en.cppreference.com/w/cpp/language/storage_duration)

举个例子:

#include <iostream>
#include <vector>
#include <thread>
thread_local std::vector<int> v;
void func()
{
  v.push_back(5);
  std::cout<< "t: "<< v.size() << std::endl;
}
int main() 
{
    v.push_back(3);
    v.push_back(5);
    std::thread t1(func);
    std::thread t2(func);
    std::cout<< "m: "<< v.size() << std::endl;
    t1.join();
    t2.join();
}
输出:

m: 2
t: 1
t: 1

thread_local所做的是为每个线程创建一个不同的向量。在示例中,您可以看到主线程中的v有2个元素,而其他线程中的矢量v每个只有1个元素。

的情况是,当创建一个新线程时,程序也将仅为该线程创建一个新向量。当线程结束时,向量也将被销毁。

thread_local使对象具有线程存储,这意味着每个线程将拥有自己单独的对象实例。它不会以任何方式影响对象的线程安全,就像你似乎暗示的那样。

你可以声明一个vector变量,或者任何其他变量,如果你想让每个线程都有自己的thread_local变量实例。如果你希望能够并发访问单个对象,解决方案不是将其声明为thread_local,而是使用线程安全的数据类型或适当的同步原语(例如通过锁定和解锁std::mutex)。

相关内容

最新更新