2009-05-05 6 views
0

Dies ist ein Ableger von this Frage, aber mit ein paar Einschränkungen entfernt.Nicht Threadlocked Mutex

Ich habe ein System, wo ich Dateisperre verwalten muss. Ich muss in der Lage sein, eine Datei (Shared Read Locking) in einem Thread zu sperren und dann in einem anderen zu entsperren. Genauer gesagt kann ich nicht sicher sein, in welchem ​​Thread es freigeschaltet wird oder ob der Erstellungs-Thread noch vorhanden ist.

Ich brauche auch exklusive Schreibsperre, um damit zu gehen, aber das wird alles im selben Thread sein.

die .NET Mutex wird nicht funktionieren, da es zusätzliche Dinge tut, wenn das Erstellen Thread

Antwort

1

Vielleicht ein (benannt) Semaphore mit einer Zählung eines verlässt? WaitOne zu sperren, Release zu entsperren?

+0

siehe bearbeiten: vergessen zu erwähnen Ich suche nach gemeinsamen Sperren. Abgesehen davon +1 – BCS

0

Klingt mir wie ein Drehkreuz Problem. Sie müssen die Lesegeräte verwalten, wobei der erste die Datei sperrt und der letzte die Datei freigibt. Sie können einen Semaphor verwenden, um dies zu implementieren. Sie können dem Schreiber den Vorzug geben, indem Sie das Drehkreuz sperren, während ein Schreiber wartet.

+0

Das ist genau das, was ich will, aber ich habe keinen Weg gefunden, wo das Sperren und Entsperren in verschiedenen Threads passieren kann (Thread A-Sperren, Thread B entsperrt) – BCS

+0

Sie könnten ein benutzerdefiniertes Semaphor haben sperrt die Datei beim ersten Token und entsperrt die Datei, wenn das letzte Token zurückgegeben wird. – Stinomus

+0

Nur zur Verdeutlichung wird die Lesesperre dann durch den Semaphor aufrechterhalten, so dass sie nicht tatsächlich von einem Thread als solchem ​​gehalten wird. Der erste Thread öffnet effektiv das Gate und dann schließt der letzte Thread ihn, dies wird durch den Semaphor verwaltet, wenn der Tokenzähler von 0 inkrementiert oder auf 0 dekrementiert wird, die Threads selbst wissen nicht, ob sie die öffnen oder schließen Tor. – Stinomus

1

Die Frage, die Sie verknüpft haben, ist Prozessgrenzen zu überschreiten, aber von dem, was ich lese, Sie nur Threads kreuzen ... in diesem Sinne denke ich, dass Jeff Richter ReaderWriterGate-Klasse gut zu Ihrem Problem passt. Damit können Sie den Zugriff auf eine freigegebene Ressource steuern und Zugriffsanforderungen für die Ressource in die Warteschlange stellen. Es scheint keine Thread-Affinität zu haben. Wenn Sie also Prozessgrenzen nicht überschreiten, ist das möglicherweise eine Lösung für Sie. Hier

ist ein Link zu einem Artikel über die Klasse ... Concurrent affairs und Sie können die PowerThreading Library from here

Downloads Wenn Ihr Fall ist wirklich einfach (mit Ausnahme der Verriegelung von einem Thread und von einem anderen Freigabe) I don‘ Warum können Sie das eingebaute ReaderWriterLock in .NET nicht verwenden (obwohl das in der PowerThreading-Bibliothek viel schneller sein soll). Die Monitor class hat keine Thread-Affinität und kann von jedem Kontext aus zugegriffen werden, je nachdem, wie Sie es verwenden, kann dies Ihre einfachste Lösung sein.

+0

Ich werde sie mir ansehen. Die MSDN-Links klingen mehr wie das, was ich wirklich will. – BCS

+0

Gerrr ... ReaderWriterLock, ReaderWriterLockSlim und Monitor sind alle Thread gesperrt. :( – BCS

+0

Haben Sie sich Richters Sachen angesehen? –