Есть ли способ повторно использовать std :: atomi c для данного int32_t? - PullRequest
3 голосов
/ 04 марта 2020

У меня есть int32_t с начальным значением 42. Теперь я хочу, чтобы к нему был атомный доступ несколькими потоками.

#include <atomic>

using namespace std;
int32_t* pn{};

int main()
{
    pn = getPtrFromMmap();    
    assert(42 == *pn); // note that *pn is mapped to a disk file

    // How to make the following two threads access *pn atomically?
    std::thread{[&]{ (*pn)++; }}.detach(); 
    std::thread{[&]{ (*pn)++; }}.detach();
}

Это не тривиальная задача - написать правильный атом c класс эксплуатации. Итак, я попытался использовать std::atomic для достижения своей цели, но потерпел неудачу.

Есть ли способ повторно использовать std::atomic в таком случае?

1 Ответ

5 голосов
/ 04 марта 2020

Нет.

Представьте, что std::atomic примерно

template <typename T>
class atomic {
    T value;
public:
    // a bunch of member functions
};

Т.е. std::atomic<int32_t> содержит int32_t.

Вам нужен

template <typename T>
class atomic_ref {
    T & ref;
public:
    // a bunch of member functions
};

Такой тип не является членом std::.

В C ++ 17 std::atomic<std::reference_wrapper<T>> гарантированно действителен, но это не так. здесь не поможет Операции на референте не являются атомами c.

...