Rozumiem koncepcję bezpieczeństwa gwintów. Szukam porady, aby uprościć bezpieczeństwo wątków, próbując chronić pojedynczą zmienną.Bezpieczeństwo gwintów pojedynczej zmiennej
Say mam zmienną:
double aPass;
i chcę chronić tę zmienną, więc tworzę mutex:
pthread_mutex_t aPass_lock;
Teraz istnieją dwa dobre sposoby mogę myśleć w ten sposób ale obaj mają denerwujące wady. Pierwszym jest stworzenie bezpiecznego klasę gwintu posiadać zmienną:
class aPass {
public:
aPass() {
pthread_mutex_init(&aPass_lock, NULL);
aPass_ = 0;
}
void get(double & setMe) {
pthread_mutex_lock(aPass_lock);
setMe = aPass_
pthread_mutex_unlock(aPass_lock);
}
void set(const double setThis) {
pthread_mutex_lock(aPass_lock);
aPass_ = setThis;
pthread_mutex_unlock(aPass_lock);
}
private:
double aPass_;
pthread_mutex_t aPass_lock;
};
Teraz będzie to zachować aPass
całkowicie bezpieczny, nic nie może się mylić i nigdy go dotknąć, yay! jednak spójrz na cały ten bałagan i wyobraź sobie zamieszanie podczas uzyskiwania dostępu do niego. obrzydliwy.
Innym sposobem jest uzyskanie dostępu do obu tych funkcji i upewnienie się, że blokujesz muteks przed użyciem aPass.
Ale co, jeśli ktoś nowy przyjdzie na projekt, a jeśli zapomnisz jeden raz, aby go zablokować. Nie lubię debugowania problemów z wątkami, które są trudne.
Czy istnieje dobry sposób na (przy użyciu pthreads, ponieważ muszę używać QNX, który ma mało wsparcia doładowania) Aby zablokować pojedyncze zmienne bez potrzeby dużej klasy, a to jest bezpieczniejsze, to po prostu tworzenie blokady mutex, aby przejść z nim?
ta zmienna jest zmienną globalną? nie sądzę, że masz dużo innego wyboru, chyba że chcesz utworzyć ogólną klasę kontenera wątku bezpiecznego - to zaoszczędziłoby ci trochę kodu, jeśli musisz to zrobić do drugiego var. –
masz na myśli jak klasę szablonową? to brzmi całkiem nieźle. –
również, czy nie jest to możliwe dzięki projektowi ur do duplikowania var? apass jest klasą, więc mogę mieć tyle obiektów ile chcę –