我制作了一个同时写入同一个 vector 的线程池。
这个实现线程安全吗?
如果不是,我该如何解决?
std::vector<double> global_var;
void func1(int i)
{
global_var[i]=some_computation(i /* only depends on i */);
}
void load_distribution()
{
const int N_max=100;
global_var.assign(N_max,0.0);
std::vector<std::thread> th_pool;
for(long i=0;i<N_max;i++)
th_pool.push_back(std::thread(func1,i));
for(std::thread& tp : th_pool)
tp.join();
}
更新
global_var
在所有线程终止之前不会被程序的任何其他部分触及。
最佳答案
假设您的全局 vector 未被代码的任何其他部分修改,那么您的代码是线程安全的。
每个线程都将写入(访问) vector 的不同单元格,因此不存在“脏更新”问题。
此外, vector 的类型是 double 型,在现代架构中大于 WORD 大小。因此每个阵列单元之间不重叠。
关于c++ - 对 std::vector 元素的赋值是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387751/