Ist bool thread safe?

Thomasio

Erfahrenes Mitglied
Wenn ich ein global flag verwende und 2 threads unabhängig voneinander darauf zugreifen, kann das in undefiniertem Verhalten enden?
Es ist völlig egal, ob die beiden threads immer den richtigen Wert fürs flag bekommen, ich muss nur sicher stellen, dass immer 0 oder 1 raus kommt, nie undefiniert.

Code:
//global
bool MyFlag = 0;

DWORD WINAPI Thread1(LPVOID data)
{

while(1)
{

int Irgendwas = SomeFunction();
int Sonstwas = SomeOtherFunction();

if(Irgendwas > Sonstwas)
  {
    MyFlag = 1;
  }
else
  {
    MyFlag = 0;
  }

}

return 0;

}

DWORD WINAPI Thread2(LPVOID data)
{

while(1)
{

if(MyFlag)
  {
    // mach was;
  }
else
  {
    // mach was anderes;
  }

}

return 0;

}
 
Hi,

ein "bool" ist ein primitiver Datentyp, welcher per Definition nur die Werte "true" und "false" haben kann.
Es ist daher nicht möglich, egal was du anstellst, dass dieser zum Beispiel auf einmal -1 oder 2 wird.

Gruß
BK
 
Dass ein bool nicht 2 werden kann ist mir klar.
Die Frage ist, was passiert beim überschreiben?
Egal ob der Wert sich dabei ändert oder gleich bleibt, gibt es dabei ein paar ns lang "nicht definiert" oder "nicht initialisiert", so dass Thread2 abstürzen würde?
 
Achtung, dein Compiler kann aber versuchen, schlau zu sein, und evtl. merkst du eine Änderung des Bools aus einem anderen Threads nicht. Bei so etwas dann immer volatile verwenden!
 
Bool ist ein sogenannter intrinsischer Typ (wie int, char...) diese Typen werden vom Prozessor in einem Schritt verarbeitet, da sie Platz in einem Prozessor-Register haben. Es kann also theoretisch kein anderer Thread dazwischen funken.

Im zweifelsfall immer Locks (Mutex o. ä.) benutzen.
 
Also im System Programming Guide von Intel findet man dies:

Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that the following
basic memory operations will always be carried out atomically:
. Reading or writing a byte
. Reading or writing a word aligned on a 16-bit boundary
. Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that the following
additional memory operations will always be carried out atomically:
. Reading or writing a quadword aligned on a 64-bit boundary
. 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following
additional memory operation will always be carried out atomically:
. Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache
line

Danach kann man noch lesen das man fast alle Operationen (BTS,...INC, DEC, ADD, ADC,.....) bis
auf XCHG was immer automatisch mit einem LOCK versehen wird einen LOCK Präfix verwenden sollte.

Für Intel ist es also keineswegs sicher, das ein Assemblerbefehl ununterbrochen den Bus behält.

Wenn es so dokumentiert ist tut man gut daran es zu berücksichtigen ..
 
Zurück