У меня есть несколько вопросов об использовании блокировки для защиты моей общей структуры данных. Я использую 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++;
}
};
Нужно ли мне использовать std::lock_guard
в методе getCount()
, чтобы сделать его потокобезопасным?
Что произойдет, если есть только два потока: поток чтения и поток записи, то должен ли я вообще его защищать? Поскольку только один поток изменяет переменную, я думаю, что потерянного обновления не произойдет.
Если для общей переменной примитивного типа (например, int
) есть несколько устройств записи/чтения, какая катастрофа может произойти, если я заблокирую только метод записи, но не метод чтения? Будет ли 8-битный тип иметь какое-либо значение по сравнению с 64-битным типом?
Является ли любой примитивный тип атомарным по умолчанию? Например, запись в char
всегда атомарна? (Я знаю, что это верно для Java, но не знаю о C++, и я использую компилятор llvm на Mac, если платформа имеет значение)