use*_*114 3 c++ multithreading vector thread-local stdvector
有没有宣布任何优势std::vector的thread_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::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();
}
Run Code Online (Sandbox Code Playgroud)
输出:
m: 2
t: 1
t: 1
Run Code Online (Sandbox Code Playgroud)
thread_local为每个线程创建不同的向量是什么.在示例中,您可以v从主线程中看到有2个元素,而v其他线程中的向量每个只有1个元素.
所发生的是,当创建新线程时,程序也将仅为该线程创建新向量.线程结束时,矢量也会被破坏.