2016-05-15 11 views
0

Normalerweise, wenn ich thread-sichere Funktionen machen möchte, sperre ich die geteilten Daten und lasse sie dann los, wenn ich mit der Arbeit fertig bin.C: Wie kann diese Funktion threadsicher gemacht werden?

Hier arbeite ich mit einer globalen Variable. Einfaches Sperren und Entsperren stellt nicht sicher, dass die Funktion einen eindeutigen Wert zurückgibt. Wie ändere ich die folgende Funktion als threadsicher und stelle sicher, dass immer eine eindeutige Ganzzahl zurückgegeben wird?

int count = 0; 
int GetUnique() 
    { 
    count = count + 1; 
    return count; 
    } 

Einige Leute haben erwähnt, eine lokale statische Variable innerhalb der Funktion zu machen? Wie und warum würde das funktionieren (wenn es wahr ist)?

+1

Die Funktion muss nicht "count" zurückgeben. 'int lokale_anzahl; sperren(); Anzahl = Anzahl + 1; local_count = zählen; Freischalten(); return local_count; '? –

+1

@iharob - Das Sperren/Entsperren ist Overkill, die CPU hat spezifische Anweisungen, um diesen genauen Anwendungsfall ohne jegliche Verriegelung zu handhaben. – Geoffrey

+0

@Geoffrey Ich gehe davon aus, dass dies erforderlich ist, weil es aussieht wie eine Hausaufgabe oder ähnliches. –

Antwort

4

Sie möchten in diesem Fall ein atomares Inkrement verwenden, keine Sperrung oder Mutexe, wenn Sie GCC-Eigen- schaften verwenden. __sync_add_and_fetch ist, was Sie hier suchen, oder für VC InterlockedIncrement wird das gleiche durchführen.

Sie könnten diesen Code portabel machen mit dem folgenden:

#ifdef _WIN32 
#define SYNC_ADD_AND_FETCH(x) InterlockedIncrement(&(x)) 
#else 
#define SYNC_ADD_AND_FETCH(x) __sync_add_and_fetch(&(x), 1) 
#endif 

int main(int argc, char *argv[]) 
{ 
    int v = 0; 
    SYNC_ADD_AND_FETCH(v); 
    printf("%d\n", v); 
} 

So dass es statisch nicht genug sind, um die Variable von anderen Threads zu schützen on the fly ändern, in der Tat ist es nicht in irgendeiner Weise hilft.

+1

"* nicht genug zu *"? 'statisch' hilft überhaupt nicht. – alk

+0

^^^ was @alk sagt. 'static' in den Multithread-Apps'libs/was auch immer ist in der Regel katastrophal. –

+0

@Marin James - Nur unheilvoll, wenn atomare Operationen nicht beobachtet werden. – Geoffrey

Verwandte Themen