Naja, ich sag mal, eigentlich sollte der genauso funktionieren wie dein Code.
Wieso meinst du, dass er nicht funktioniert?
Nein, das ist leider absolut falsch, du nutzt nur einen normalen Lock mit einer globalen Variable, während mein Code eine Twofold-Lock und Ticketsystem(warteraum) nutzt.
Grund:
Zitat
- Checking and setting the lock variable
is by itself a critical section.
- The simple lock approach does not
meet all requirements for a solution to
protect a critical section.
Ein Lock reicht ungünstigerweise nicht aus, da das Sichern eines kritischen Abschnittes selbst kritisch ist.
Dein Code hat leider Konflikte im kritischen Abschnitt Output:
(Threads: 20 Brückenüberfahrten: 10.000)
Threads: 20
bridge crosses: 10019
accidents: 4223
time: 1.238070
(Threads: 5 Brückenüberfahrten: 100.000)
Threads: 5
bridge crosses: 100004
accidents: 3270
time: 3.146314
Mein Code (Ohne Konflikte):
(Threads: 20 Brückenüberfahrten: 10.000)
Threads: 20
bridge crosses: 10019
accidents: 0
time: 1155.172462
(Threads: 5 Brückenüberfahrten: 100.000)
Threads: 5
bridge crosses: 100004
accidents: 0
time: 24.827244
Aufgrund Lage der Zeit habe ich das nicht weiter hochskaliert, aber ich kann dir sagen, dass "Multiple Locks with Mutual Access – Lamport"
Zitat
The multiple locks with mutual access (Lamport) approach meets all requirements for a solution to protect a critical section.
Das heißt in beiden Fällen kann es zu einer Race-Condition kommen, da die Variablen nicht richtig synchronisiert werden zwischen den Threads.
Natürlich versucht jeder am schnellsten den lock zu nutzen. Jedoch, durch den Twofold-Lock, warten die anderen Threads bis ein Thread wieder aus dem kritischen Abschnitt ist, dies ist aber nur möglich mit den Twofold-Lock und einem Warte-System. oder "Twofold Lock with Mutual Precedence"
Dafür sollte man z.B. stdatomic.h oder Mutexes nutzen.
Wie erwähnt, sollen wir das ohne Hardware- oder Betriebssystemunterstützung lösen.
Mit Mutex ist es ja ganz simpel :3
Clean Code ist sehr wichtig, aber Kaliber du musst darauf achten, dass dein Clean Code nicht die Korrektheit ändert. Was bei deinem Code bedauerlicherweise der Fall ist.
Dein Cleaner Code hätte jetzt mein Code verbuggt.
Am Ende wurde meine Frage beantwortet von dir, also danke ich dir nochmals dafür. 