Threads und static int
-
Moin Wissende in der Welt!
Eine dumme Frage:
int get_id() { static int cnt = 0; return(cnt++); }
Diese "Funktion" soll von mehreren threads aufgerufen werden. Es stellt sich die Frage ob ein ++ eine atomic operation ist und ich somit auf ein "teuren" mutex-lock verzichten kann???
Daaaanke
Karsten
-
hmm gute frage, hängt wohl vom prozessor ab. Ob der ein inc als atomic funktion hat oder das wirklich berechnen muss. Ich denke aber die meisten intel prozessoren müssten ein inc haben. Aber soweit ich weiss geht das nur über ein register. Was wiederum heißt das es nicht atomic wäre weil es muss ja der wert t ins register geladen werden und dannach das inc register aufgerufen werden. Dann ist halt die Frage was macht der compiler, merkt er sowas und initialisiert das register vor etc.... Also genau kann ichs nicht sagen. cnt = 0 könnte aber schon probleme geben weil das scheint nicht atomar zu sein. es könnte also schon beim ersten inkrementieren der Wert wieder auf 0 gesetzt werden.
-
prinzipiell solltest du alle allgemeinen rechenoperationen als nicht atomar ansehen, weil hier die compilerhersteller machen und optimieren koennen wie beliebt -> ergo nicht definiert.
fuer grundlegende MT operationen stellt dein BS dir funktionen zur verfuegung, wo sicher sein kannst das dir kein anderer theread in quere kommt ....
InterlockedIncrement unter windows z.b.
Ciao ...
-
Moin!
Vielen Dank für die Tipps. Da ich eben auch nicht weiss was die Compiler machen und das Programm nachher auf INTEL(LINUX), PA-RISC(HP-UX) und SPARC(SunOS) laufen soll, werde ich wohl dann doch ein pthread_mutex_lock() spendieren müssen.
Danke für eure Hilfe!
Karsten