mutex schreiben
-
hustbaer schrieb:
Man ist immer auf Hilfe vom OS/Compiler/... angeweisen, da C++ (noch) keine Atomaren Operationen kennt, sowie auch (noch) keine fertigen Mutexen o.Ä.
ok, dachte ich mir schon. thx für die info.
hintergrund ist: ich hätte gern ein mutex dass für schreib- und lesezugriffe getrennt gelockt werden kann (schreibzugriff soll blockieren bis nicht mehr gelesen und geschrieben wird, lesezugriff nur bis nicht mehr geschrieben wird). criticalsections scheinen das nicht leisten zu können.
-
warum nimmst du nicht einfach 2 critical sections/mutexe: eine für lesen und eine für schreiben. also so in der art:
class blub { CriticalSection cs_read; CriticalSection cs_write; // ... public: void read() { lock(cs_write); // ... } void write() { lock(cs_read); lock(cs_write); // ... } // ... };
-
Für x86 Architekturen kannst du dir bestimmt ein Mutex in Assembler mit der TSL (Test - Set - Lock) Anweiseisung schreiben.
-
dot schrieb:
warum nimmst du nicht einfach 2 critical sections/mutexe: eine für lesen und eine für schreiben.
weil die einfachste nicht unbedingt auch die beste/schönste/eleganteste/schnellste/whatever lösung sein muss.
-
hä?
-
dot schrieb:
hä?
ich meinte, vielleicht gibts ja eine bessere lösung als die triviale aus deinem vorschlag.
dein ansatz hat zudem das problem, dass lesezugriff von mehreren threads gleichzeitig nicht funktioniert, weil read() dann blockiert.
-
stimmt
-
locker schrieb:
hintergrund ist: ich hätte gern ein mutex dass für schreib- und lesezugriffe getrennt gelockt werden kann (schreibzugriff soll blockieren bis nicht mehr gelesen und geschrieben wird, lesezugriff nur bis nicht mehr geschrieben wird). criticalsections scheinen das nicht leisten zu können.
Schonmal über Semaphore nachgedacht?
-
CStoll schrieb:
Schonmal über Semaphore nachgedacht?
noch nicht wirklich - sah auf den ersten blick in windows recht aufwendig und potenziell langsam aus. ich schaus mir mal genauer an.
-
locker schrieb:
sah auf den ersten blick in windows recht aufwendig und potenziell langsam aus
das sind mutexe auch :p
-
ist mein code nich rein C++?
-
Nein, der nutzt die WinAPI. Reines C++ kennt keine Multithreading-Ansätze und keine Synchronisation.
-
Read-Write-Mutexen sind IMO grundsätzlich problematisch.
Spätestens dann wenn man die Möglichkeit will einen Read-Lock auf einen Write-Lock "upzugraden". Dann muss nämlich (in manchen Fällen) der Read-Lock temporär hergegeben werden, bis ein Write-Lock geholt werden kann. Und das ist etwas was Programmierer die mit der fertigen Klasse arbeiten gerne übersehen werden - d.h. die werden davon ausgehen dass das was sie vor dem "upgrade" gelesen haben auch nach dem "upgrade" noch so ist -- was aber eben nicht so sein muss.
-
ich habe jetzt mal http://doc.trolltech.com/qq/qq11-mutex.html mit windows-mitteln umgesetzt. gibts daran irgendwas auszusetzen? vielleicht irgendwelche nicht offensichtlichen fallen?
der thread ist hier mittlerweile offtopic, kann gerne nach winapi verschoben werden.
-
BorisDieKlinge schrieb:
ist mein code nich rein C++?
Schlag doch einfach mal im C++-Standard oder www.cppreference.com folgende Ausdücke nach:
BorisDieKlinge schrieb:
... CRITICAL_SECTION ... InitializeCriticalSection... DeleteCriticalSection... EnterCriticalSection... LeaveCriticalSection... TryEnterCriticalSection...
Gruß,
Simon2.
-
um mir mal schizomäßig selbst zu antworten:
locker schrieb:
vielleicht irgendwelche nicht offensichtlichen fallen?
in criticalsections kann der selbe thread mehrfach eintreten ohne zu blockieren. bei semaphoren geht das nicht.

-
Klar geht das bei semaphoren.
-
Tyrdal schrieb:
Klar geht das bei semaphoren.
nicht bei windows-semaphoren, dazu müsste ich wohl meine eigene schreiben.
-
locker schrieb:
um mir mal schizomäßig selbst zu antworten:
locker schrieb:
vielleicht irgendwelche nicht offensichtlichen fallen?
in criticalsections kann der selbe thread mehrfach eintreten ohne zu blockieren. bei semaphoren geht das nicht.

Und, wo ist das Problem?
Statt der QMutex nimmst du ne Critical Section und statt der QSemaphore eben ne Windows Semaphore, das passt schon alles.Dann hast du einen schön langsamen Read-Write-Lock gebastelt

-
hustbaer schrieb:
Statt der QMutex nimmst du ne Critical Section und statt der QSemaphore eben ne Windows Semaphore, das passt schon alles.
tuts nicht. momentan habe ich keine unterscheidung zwischen lesen und schreiben drin. und es wird mit einer critical section synchronisiert, welche ja problemlos mehrfach im gleichen thread gelocked werden kann, davon geht der bestehende code auch aus. das funktioniert mit einer semaphore nicht, weil die sich einen dreck drum schert, welcher thread locked.