Créez un fichier verrouillé avec boost :: interprocess :: file_lock

J’aimerais utiliser boost::interprocess::file_lock pour m’assurer que les fichiers écrits dans un répertoire x par le processus P1 ne sont pas lus par le processus P2 tant qu’ils ne sont pas terminés. Pour ce faire, j’aimerais que P1 verrouille les fichiers avec boost::interprocess::file_lock pendant qu’il les écrit, puis les déverrouille ensuite. Ensuite, P2 peut simplement ignorer (et revenir à) tous les fichiers verrouillés.

Le problème que j’ai, c’est qu’il semble que boost::interprocess::file_lock ne vous permet de verrouiller que les fichiers existants. Mais si je crée d’abord le fichier, puis le verrouille, il existe une condition de concurrence critique dans laquelle:

  1. P1 crée le fichier
  2. P2 remarque le fichier et commence à le lire
  3. P1 verrouille le fichier
  4. P1 écrit des données
  5. P2 lit des données, arrive à la fin et ne contient qu’une partie de la sortie de P1 .

Donc, ce que j’aimerais faire, c’est créer un fichier et le verrouiller dès sa création. Est-il possible de faire cela en utilisant boost::interprocess::file_lock ?

Vous comprenez mal le but de boost :: interprocess :: file_lock, lorsque vous créez un fichier_lock en utilisant la méthode boost :: interprocess :: file_lock test_lock (“mon_fichier”), vous ne protégez pas le fichier “mon_fichier” de la lecture / écriture
par d’autres processus, vous déclarez simplement que vous avez un verrou faisant référence au fichier “mon_fichier”; si d’autres processus ont également des verrous faisant référence au même fichier, vous pouvez implémenter une exclusion mutuelle entre ces verrous, mais ces verrous ne sont pas importants. sur l’opération de lecture / écriture sur le fichier “mon_fichier”, le fichier est juste un drapeau

Non, mais il existe une solution de contournement qui utilise uniquement un fichier vide supplémentaire.

Avant que P2 ne tente de rechercher des fichiers, créez un fichier vide avec un nom bien connu de P1 et de P2. Avant que P2 ne commence à numériser, il verrouille ce fichier vide et le libère une fois le répertoire analysé (c.-à-d. Qu’il ne doit pas le verrouiller lors de la lecture de données à partir de fichiers). Avant que P1 ne crée un nouveau fichier, il verrouille ce fichier vide et relâche le verrou une fois le nouveau fichier créé et verrouillé.

Je pense que la façon dont vous devriez être capable d’éviter la condition de concurrence est la suivante:

  1. P1 crée le fichier
  2. P2 remarque le fichier: a. Le verrouille et b. Commence à le lire
  3. P1 essaie de verrouiller le fichier, doit attendre.
  4. P2 terminé la lecture, déverrouille le fichier
  5. P1 verrouille le fichier
  6. P1 écrit des données

Faites-moi savoir si ce n’est pas clair.

Merci,

Mohit