Многопоточность: нужно ли защищать переменную в методе только для чтения?

У меня есть несколько вопросов об использовании блокировки для защиты моей общей структуры данных. Я использую C/C++/ObjC/Objc++

Например, у меня есть класс счетчика, который используется в многопоточной среде

class MyCounter {
private:
    int counter;
    std::mutex m;

public:
    int getCount() const {
        return counter;
    }
    void increase() {
        std::lock_guard<std::mutex> lk(m);
        counter++;
    }
};
  1. Нужно ли мне использовать std::lock_guard lk( m);в методе getCount(), чтобы сделать его потокобезопасным?

  2. Что произойдет, если есть только два потока: поток чтения и поток записи, то должен ли я вообще его защищать? Поскольку только один поток изменяет переменную, я думаю, что потерянного обновления не произойдет.

  3. Если для общей переменной примитивного типа (например, int) есть несколько устройств записи/чтения, какая катастрофа может произойти, если я заблокирую только метод записи, но не метод чтения? Будет ли 8-битный тип иметь какое-либо значение по сравнению с 64-битным типом?

  4. Является ли любой примитивный тип атомарным по умолчанию? Например, запись в charвсегда атомарна? (Я знаю, что это верно для Java, но не знаю о C++, и я использую компилятор llvm на Mac, если платформа имеет значение)

7
задан MSalters 23 March 2012 в 08:10
поделиться