Uncontended Mutex Guard: Inside vs. Outside the Loop Body

Question 46 / 51 Correct so far: 0 (0 answered)

Snippet A

Lock Per Iter

long long sumLocked(const std::vector<int>& data, std::mutex& mtx) {
    long long sum = 0;
    for (int x : data) {
        std::unique_lock<std::mutex> lk(mtx);
        sum += x;
    }
    return sum;
}

std::mutex mtx;

long long result = sumLocked(DATA, mtx);
Snippet B

Lock Hoisted

long long sumLocked(const std::vector<int>& data, std::mutex& mtx) {
    long long sum = 0;
    std::unique_lock<std::mutex> lk(mtx);
    for (int x : data)
        sum += x;
    return sum;
}

std::mutex mtx;

long long result = sumLocked(DATA, mtx);
Shared test data (shared-setup)
constexpr int kDataSize = 4096;

static std::vector<int> makeData() {
    std::vector<int> v(kDataSize);
    for (int i = 0; i < kDataSize; ++i) v[i] = i;
    return v;
}

static const std::vector<int> DATA = makeData();

For an uncontended mutex, which snippet is faster?

Select the correct answer(s)