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

use*_*114 3 c++ multithreading vector thread-local stdvector

有没有宣布任何优势std::vectorthread_local?喜欢

static unique_ptr<std::vector<ObjectA>> vecVariable;
Run Code Online (Sandbox Code Playgroud)

声明std::vector为thread_local不会使其操作像pop_back()erase()同步.

由于在每一个STL容器,如果有一个线程修改的容器,然后应无并发线程读取或写入同一容器中,所以我不能做erase()pop_back()一对vector在并行/多线程环境中的对象.

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

Hay*_*ayt 6

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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

m: 2
t: 1
t: 1
Run Code Online (Sandbox Code Playgroud)

thread_local为每个线程创建不同的向量是什么.在示例中,您可以v从主线程中看到有2个元素,而v其他线程中的向量每个只有1个元素.

所发生的是,当创建新线程时,程序也将仅为该线程创建新向量.线程结束时,矢量也会被破坏.