Klausur Juli 2010, Threadsynchronisation, readdir

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Klausur Juli 2010, Threadsynchronisation, readdir
In der Klausur Juli 2010 habe ich das Problem, dass mehrere Threads parallel Verzeichnisse parsen sollen.
readdir() sollte laut Folien ja nicht parallel verwendet werden, da es nur einen Zeiger auf interne daten zurueckgibt, und dieser
dann ungueltig werden kann.

Ich habe das jetzt in der thread Funktion mit einem extra Mutex geloest:

DIR *dir = opendir(dirname);
if(!dir) {...}
struct dirent *entry;
pthread_mutex_lock(&mReaddir);
while(errno = 0, entry = readdir(dir)) {
   /* lstat, entry->d_name kopieren */
   pthread_unlock(&mReaddir);
   /* doStuff */
   pthread_mutex_lock(&mReaddir);
}
pthread_unlock(&mReaddir);

Bin nicht sicher, ob das so gedacht ist, kann mich auch nicht daran erinnern, das in der Uebung mal so aehnlich gemacht zu haben…
So ok, oder sollte man das irgendwie anders machen?

Danke schon mal,
Oliver


Es gibt stattdessen [m]readdir_r(3)[/m], das man aus mehreren Threads gleichzeitig benutzen kann. Ein Problem ist das ganze aber nur dann, wenn man auf dem selben [m]DIR *[/m] arbeitet. Du du hier scheinbar pro Thread ein Verzeichnis öffnest und der [m]DIR *[/m] den Thread nicht verlässt, kannst du dir das locking sparen und einfach [m]readdir(3)[/m] verwenden.

Intern ist das vermutlich so realisiert, dass der Speicher, auf den [m]readdir(3)[/m] einen Pointer zurückgibt beim [m]opendir(3)[/m] allokiert wird.


ok danke! dachte schon dass das mal wieder zu kompliziert gedacht war :wink:


Aehm, ich bin mir da grade nicht so ganz sicher ob die Antwort so richtig ist. readdir(3) muss nicht reentrant sein, dass es das zufaellig bei verschiedenen DIR* doch ist ist evtl nur ein Implementierungsdetail. Ich sehe zumindest in der Spec nichts, was dem readdir(3) verbieten wuerde kaputtzugehen: http://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html

Edit: Da steht zwar “The pointer returned by readdir() points to data which may be overwritten by another call to readdir() on the same directory stream. This data is not overwritten by another call to readdir() on a different directory stream.”. Das heisst aber trotzdem nicht, dass es mit mehreren Threads nicht doch kaputtgeht, weil damit irgenwelche internen (static, globale) Daten die sich das readdir aufheben koennte (Cache fuer die naechsten paar Verzeichniseintraege oder Aehnliches) nicht verboten sind.