Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit Threads und fmShareExclusive / fmShareDenyWrite? (https://www.delphipraxis.net/106054-problem-mit-threads-und-fmshareexclusive-fmsharedenywrite.html)

kaiser1401 4. Jan 2008 13:28


Problem mit Threads und fmShareExclusive / fmShareDenyWrite?
 
Hallo,

weiß jemand ob es zu Problemen kommen kann wenn ich mehrere Threads in einer Anwendung habe und diese gleichzeitig auf eine Datei zugreifen wollen? (TFilestream) Die Streams werden entweder mit fmShareDenyWrite (zum lesen) oder fmShareExclusive (zum lesen und schreiben) geöffnet. Dies jeweils in einer Schleife um bei einer Exception (wenn jemand anderes die datei nutz) zu warten und es nocheinmal zu versuchen bis der timeout erreicht ist.

In der Hilfe steht ja das keine andere Anwendung auf die Datei zugreifen kann. Aber bei einem weiteren Thread der gleichen Andwendung sollte das doch auch keine Probleme geben, oder?

Kennt jemand da Irgendwelche Probleme in diesem Zusammenhang? Probleme treten nur sporradisch auf. Ich bin mir auch nciht sicher ob das die Ursache ist, aber beim Kunden steht es halt ab und zu nachdem beide Threads sehr Zeitnah (oder gleichzeitig, so genau ist das log nciht) an die gleichen Dateien müssen. Unter umständen klaufen sie dann aber nach einigen Minuten (<1 bis >60) wieder an..... Mal eben Testen ist leider auch nciht so einfach.

Also Wenn jemand ein solches Problem kennt her damit... sonst muss ich wohl weiter suchen.

Dezipaitor 4. Jan 2008 17:13

Re: Problem mit Threads und fmShareExclusive / fmShareDenyWr
 
Dass eine andere Anwendung mit den Flags gesperrt wird hat schon seinen Sinn. Eine Ebene tiefer existiert genau dasselbe Problem bei mehrere Threads. Der gleichzeitige Zugriff über ein Dateihandle (das nutzt TFileStream ausgiebig) mit mehreren Threads funktioniert eben nicht immer. Gleichzeitiges Lesen dürfte kein Problem sein, doch schon beim Schreiben und Lesen oder sogar doppeltem Schreiben, können mehrere Datenbereichen im Müll enden.
Da die WinAPI (die nutzt ja TFileStream) nicht threadsicher ist, ist es die Aufgabe des Programmierers zu verhindern, dass mehrere Threads gleichzeitig auf dieses Handle zugreifen. Du musst es also koordinieren, sei es mit Critical Sections oder anderen Mechanismen.

Ich weiß grade garnicht, was passiert wenn jeder Thread sein eigenen TFileStream hätte. Ich vermute aber mal stark, dass die Flags den Zugriff auf Handleebene steuerun und nicht auf Prozessebene.

kaiser1401 4. Jan 2008 17:16

Re: Problem mit Threads und fmShareExclusive / fmShareDenyWr
 
Es hat jeder Thread sein eigenen Filestrem, nur halt auf die gleiche Datei. und scheinbar auch möglicherweise gleichzeitig.... Ich werds Montag mal versuchen die stellen nochmal extra mit critical sections zu schützen... und dann mal sehen was das Produktiv so macht....

Dezipaitor 4. Jan 2008 17:27

Re: Problem mit Threads und fmShareExclusive / fmShareDenyWr
 
Wenn du Critical Section verwendest oder Mutex, Semaphoren usw. kann es passieren, dass zwei Threads sich gleichzeitig ausschließen (race condition) und dann warten Sie, auf dass der andere den Lock löst.

SirThornberry 4. Jan 2008 17:28

Re: Problem mit Threads und fmShareExclusive / fmShareDenyWr
 
Es ist egal ob es ein anderer Thread, ein ander Prozess oder der selbe Thread ist. Sobald eine Datie exclusiv geöffnet ist kann sie nicht nochmal geöffnet werden.

Dezipaitor 4. Jan 2008 17:30

Re: Problem mit Threads und fmShareExclusive / fmShareDenyWr
 
Dachte ich eigentlich auch. Spielt ja alles mit den Handles rum.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz