c++ - vector 引用operator []线程安全写吗?

标签 c++ multithreading thread-safety openmp

假设我有以下代码段。

// Some function decleration
void generateOutput(const MyObj1& in, MyObj2& out);

void doTask(const std::vector<MyObj1>& input, std::vector<MyObj2>& output) {

    output.resize(input.size());

    // Use OpenMP to run in parallel

#pragma omp parallel for
    for (size_t i = 0; i < input.size(); ++i) {
        generateOutput(input[i], output[i]);
    }

}


以上威胁安全吗?
我主要关心写入output[i]
我需要某种锁定吗?还是没有必要?
前任:

// Some function prototype
void generateOutput(const MyObj1& in, MyObj2& out);

void doTask(const std::vector<MyObj1>& input, std::vector<MyObj2>& output) {

    output.resize(input.size());

    // Use OpenMP to run in parallel

#pragma omp parallel for
    for (size_t i = 0; i < input.size(); ++i) {
        MyObj2 tmpOutput;
        generateOutput(input[i], tmpOutput);
#pragma omp critical
        output[i] = std::move(tmpOutput);
    }

}

我不担心阅读部分。如this答案中所述,看起来input[i]的读取是线程安全的。

最佳答案

output[i]不写入output。这只是对std::vector<MyObj2>::operator[]的调用。它返回一个未命名的MyObj2&,然后将其用于调用generateOutput。后者是写发生的地方。

我假设generateOutput本身也是线程安全的,而且MyObj2也是线程安全的,因为我们没有相应的代码。因此,在MyObj2&中写入generateOutput也是线程安全的。

结果,所有部件都是线程安全的。

关于c++ - vector 引用operator []线程安全写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61469651/

相关文章:

c# - Entity Framework 6/SQL Server CE 4 SaveChangesAsync()

c - Linux C 程序 : where did this SIGABRT come from?

java - 是否有 Java 的 Collections.synchronizedList 的 Kotlin 等价物?或者这在 Kotlin 中是不需要的

C++ 当派生类没有实现接口(interface)中的函数时该怎么办

c++ - 减少 fgets() 中的填充次数

c++ - 尝试构建示例代码时出现编译错误

c++ - 当字符串保存在一个集合中时,c_str() 是否仍然有效

linux - 为什么在这种情况下会发生优先级反转 - Linux?

vb.net - 这个简单的 VB.Net 类线程安全吗?如果没有,我该如何改进?

Python 线程 : locking within while statement