Erstens, bedenken Sie, dass ich nicht sehr häufig Benutzer von OpenMP bin ... OK?OpenMP konditional kritisch
Jetzt, wo wir vorbei sind, gibt es so etwas wie eine bedingte critical
?
Ich interessiere mich besonders für diese Linie in einem parallelisierten for
Schleife:
(...)
#pragma omp critical
myMapOfVectors[i].push_back(someNumber);
(...)
Ich mag würde, es haben critical
, wenn und nur wenn die Fäden dieses spezielle Linie haben die gleiche i
läuft (weil wie ich erlebt haben - und bitte korrigieren Sie mich hier, wenn ich falsch liege - mehrere Threads, die zurück zu demselben vector
schieben, ist nicht threadsicher und könnte eine segfault
verursachen).
Vielen Dank für Ihre Antwort! Ich mag Ihre Lösung, aber ich würde erwarten, dass einige Richtlinien das schwere Heben für mich erledigen. Ich meine, deshalb haben wir OpenMP, nein? : P Keine Beschwerde an Sie, nur eine Kritik an OpenMP ... –
Da Pragmas Kompilierzeitrichtlinien sind, können sie nicht verwendet werden, um dynamisch zugewiesene Heap-Objekte zu synchronisieren (zumindest im allgemeinen Fall). Wenn Sie ein eigenes Stack-Objekt (mit einer festen Speicherzuweisung) implementieren, können Sie '#pragma omp atomic' verwenden, um Elemente intern einzufügen (die Einfügung wäre nicht atomar, sondern würde den Zähler inkrementieren). – dlasalle