Ho alcune domande sull'utilizzo del blocco per proteggere la mia struttura di dati condivisa. Sto usando C/C++/objC/objC++Multithreading: devo proteggere la mia variabile nel metodo di sola lettura?
Per esempio ho una classe contatore che utilizzato in ambiente multi-thread
class MyCounter {
private:
int counter;
std::mutex m;
public:
int getCount() const {
return counter;
}
void increase() {
std::lock_guard<std::mutex> lk(m);
counter++;
}
};
ho bisogno di usare
std::lock_guard<std::mutex> lk(m);
ingetCount()
metodo per farlo thread-safe?Cosa succede se ci sono solo due thread: un thread di lettura e un thread di scrittura quindi devo proteggerlo del tutto? Perché c'è solo un thread sta modificando la variabile, quindi penso che nessun aggiornamento perso accadrà.
Se ci sono più scrittore/lettore per una variabile di tipo primitivo condiviso (ad esempio
int
), cosa può accadere se si blocca solo nel metodo di scrittura ma non nel metodo di lettura? Il tipo a 8 bit farà la differenza rispetto al tipo a 64 bit?I tipi primitivi sono atomici per impostazione predefinita? Ad esempio, scrivere su un
char
è sempre atomico? (So che questo è vero in Java, ma non so di C++ e sto usando il compilatore LLVM su Mac se le cose piattaforma)
"C/C++/objc/objC++" Queste sono tutte le lingue completamente diverse. Sceglierne uno; sembri aver scelto C++. – GManNickG
Sto usando ObjC per GUI e C++ per il backend e ObjC++ per combinarli. Anche ObjC++ è superset degli altri. Ho appena scelto C++ come esempio. –
Va bene, ma non combinarli in un elenco come uno. :) Dì solo che sei interessato a una risposta in quattro lingue diverse. – GManNickG