首页 > 解决方案 > 向量引用运算符 [] 是否可以编写线程安全?

问题描述

假设我有以下代码片段。

// 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);
    }

}

我不担心阅读部分。正如这个答案中提到的,看起来阅读input[i]是线程安全的。

标签: c++multithreadingthread-safetyopenmp

解决方案


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

我会假设它generateOutput本身也是线程安全的MyObj2,因为我们没有代码。所以写入MyObj2&内部generateOutput也是线程安全的。

因此,所有部分都是线程安全的。


推荐阅读