2009-11-19 5 views

Répondre

6

Oui. Les verrous fcntl Unix (et les ressources du système de fichiers en général) sont à l'échelle du système, de sorte que deux threads d'exécution (qu'ils soient des processus séparés ou non) peuvent les utiliser. Que ce soit une bonne idée ou non dépend du contexte.

+0

Merci, ma question n'était pas de savoir si je veux faire cela mais si c'est possible. Et il s'est avéré que oui c'est possible. Merci encore. –

1

C'est une façon de synchroniser des processus, mais si vous ne voulez pas utiliser sémaphores, vous pouvez utiliser processus mutex partagé, comme les mutex et les variables de condition créées avec l'attribut PTHREAD_PROCESS_SHARED sur les plates-formes POSIX (voir pthread_mutexattr_setpshared() et pthread_condattr_setpshared()). Une autre option consiste à utiliser un mécanisme IPC (sockets, etc.) basé sur un événement qui se bloque jusqu'à ce qu'un événement que vous définissez soit démultiplexé (par exemple, via select()). Il existe également plusieurs autres options basées sur la mémoire partagée.

Cependant, puisque vous utilisez C++, je vous recommande d'utiliser un framework C++ qui simplifie grandement ce type de synchronisation interprocess sur plusieurs plates-formes telles que boost.interprocess ou ACE.

-1

Les fichiers fcntl et flock ne sont pas destinés au thread mais au process, ils ne peuvent donc pas être utilisés pour la synchronisation de threads.

+0

fcntl a une vérification de faux verrouillage multi-thread (défaut de conception). Pensez à un tel scénario, deux processus qui ont tous deux deux threads. Le fil 1 ressemble à: for (;;) {fcntl_auto_lock (file1);}. Le thread 2 ressemble à: for (;;) {fcntl_auto_lock (fichier2);}. Le fcntl renverrait EDEADLK (35) Ici peut trouver plus de détails: https://bugzilla.mozilla.org/show_bug.cgi?id=62457#c5 – alpha

Questions connexes