2016-12-18 9 views
5

Próbując zrobić unikalną funkcję generowania id i podszedł z tym:przyrost atomowa i wrócimy licznik

std::atomic<int> id{0}; 
int create_id() { 
    id++; 
    return id.load(); 
} 

Ale sądzę, że to możliwe, że funkcja zwraca taką samą wartość dwukrotnie, prawda? Na przykład wątek A wywołuje funkcję, zwiększa wartość, ale następnie zatrzymuje się, gdy wątek B wchodzi, a także zwiększa wartość, ostatecznie A i B zwracają tę samą wartość.

Więc za pomocą muteksy funkcja może wyglądać następująco:

std::mutex mx; 
int id = 0; 
int create_id() { 
    std::lock_guard<std::mutex> lock{mx}; 
    return id++; 
} 

Moje pytanie: Czy jest możliwe aby utworzyć zachowanie tarła unikalne wartości int z użyciem licznika tylko ATOMiCS? Powodem, dla którego pytam, jest to, że muszę odradzać wiele identyfikatorów, ale czytam, że muteks jest powolny.

Odpowiedz

3

Twoje dwa fragmenty kodu zrobić dwie różne rzeczy.

id++; 
return id.load(); 

ten kod wzrasta o id, a następnie zwraca zwiększoną wartość.

std::lock_guard<std::mutex> lock{mx}; 
return id++; 

że kod zwraca wartość przed przyrostu.

Poprawny kod do tego, co pierwsze stara się zrobić to

return ++id; 

Poprawny kod do tego, co drugi robi to

return id++;