Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对std::vector元素的赋值是线程安全的吗?_C++_Multithreading_Thread Safety_Threadpool_Stdvector - Fatal编程技术网

C++ 对std::vector元素的赋值是线程安全的吗?

C++ 对std::vector元素的赋值是线程安全的吗?,c++,multithreading,thread-safety,threadpool,stdvector,C++,Multithreading,Thread Safety,Threadpool,Stdvector,我创建了一个线程池,它可以同时写入同一个向量 这个实现是线程安全的吗 如果不是,我应该如何修复它 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_

我创建了一个线程池,它可以同时写入同一个向量

这个实现是线程安全的吗

如果不是,我应该如何修复它

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();
}
std::向量全局变量;
无效函数1(整数i)
{
全局_var[i]=某些_计算(i/*仅取决于i*/);
}
空荷载分布()
{
常数int N_max=100;
全局变量赋值(N_max,0.0);
std::矢量THU池;

对于(长i=0;i通常,
std::vector
不是线程安全的,但是上面的代码可以工作,因为支持数组是用
assign()
方法预先分配的

只要写入程序没有导致重新分配备份数组,代码就可以工作。
assign()
方法将预先分配足够的空间,这样在线程写入时就不会发生这种情况。

假设全局向量没有被代码的任何其他部分修改,那么代码是线程安全的

每个线程都将写入(访问)向量的不同单元,因此不存在“脏更新”问题

此外,向量的类型是双精度的,在现代体系结构中,向量的大小大于字长。因此每个数组单元之间不会重叠。

:

1为了避免数据争用([res.on.data.races]), 实现应考虑以下功能:<代码> const < /代码>:
开始
结束
rbegin
rend
前面
后面
数据
,[…],
和,关联或无序的情况除外 关联容器,
运算符[]

2尽管有([res.on.data.races]),但仍需要实现 当包含的对象的内容在 同一容器中的不同元素(向量除外)是 同时修改


虽然我不愿意承认,当前代码段实际上是线程安全的……但是,您的设计确实很脆弱。您的代码中可能还有另一部分可能会修改
global\u var
,这将引入未定义的Behavior@WhiZTiM我保证,在所有线程运行之前,
global\u var
不会被程序的任何其他部分更改erminate.just-in-case的完整代码。实际上,已使用赋值
global\u var.assign(N\u max,0.0)
如果我使用
vector
,而不是
vector
,它本身将包含其他向量。在这种情况下,赋值是否会使向量无效?@ar2015:不,它不会修改外部向量,它只会触及每个元素的内容。由于外部支持数组不会被修改,因此修改后的当然,只要每个元素都只有一个线程。非常感谢。如果我使用
向量
,会有什么问题吗?@ar2015不是,如果内存以对齐方式分配,内存分配的对齐方式是什么,或者不对齐w的示例是什么是吗?@ar2015几个月前我已经回答了这个问题。如果你想知道你在说什么,如果我使用
vector
其中
vector
包含几个
vector
本身,代码可能会失败。我是对的?