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

标签 c++ multithreading thread-safety threadpool stdvector

我制作了一个同时写入同一个 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/

相关文章:

java - 多线程服务器共享ArrayList

java - Thread#join() 是否让其他线程通过同步块(synchronized block)?

c++ - QThread.wait()函数有什么用?

android - 这个线程安全吗?

objective-c - 是ThreadedCoreData示例(来自Apple)在主线程上创建NSManagedObjectContext吗?

c++ - 如何在 solaris 中使用 mkdtemp

C++ MapViewOfFile 失败

c++ - 与设备串行对话的生产者/消费者

C++ 模板函数优化失败

scala - 如何在scala中使用ThreadLocal?