Stellen Sie sich ein Programm mit zwei Threads vor. Sie laufen den folgenden Code (CAS bezieht sich auf Compare and Swap):Können sich konkurrierende atomare Operationen gegenseitig verhungern?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
Ist es möglich, für Thread B ständig auf Thread A des CAS verursachen, so zum Scheitern verurteilt, dass 0xDEADBEEF nie auf ‚Test‘ geschrieben? Oder bedeutet natürlicher Planungs-Jitter, dass dies in der Praxis nie passiert? Was ist, wenn etwas in der While-Schleife von Thread A getan wurde?
Warum sollte es nur zweimal ausgeführt werden? Wenn es den Abruf von Test weg optimiert, ist das nicht der Effekt, dass es für immer * loop *? Der Vergleich und der Austausch werden immer fehlschlagen, weil der Vergleich fortwährend falsch ist, es sei denn, Sie haben Glück und rand() gibt den Wert des Tests zurück, bevor Thread A in die Schleife eingetreten ist und Thread A zur richtigen Zeit ausgeführt wird. –
Auch wenn Sie sagen, unglaublich unwahrscheinlich, meinst du, unwahrscheinlich, dass Sie diesen Code nicht in Produktionssoftware verwenden würde? Es wäre interessant zu versuchen, eine vereinfachte Wahrscheinlichkeit zu berechnen. –
Wenn ich persönlich sage unglaublich unwahrscheinlich, wenn es um ein Threading-Problem geht, ich meine, ich will es behoben, so dass es wirklich nicht passiert. Ich hatte zu viele "nicht wird passieren" explodieren auf mich. –