J'ai eu une exigence similaire récemment, sauf pour faire face à plusieurs processus. Voici ce que je trouve:
Si vous avez besoin de commande FIFO 100% correct, aller avec pthread ticket lock de café. Si vous êtes satisfait de 99% et privilégiez la simplicité, un sémaphore ou un mutex peut vraiment très bien fonctionner.
verrouillage du billet peut être fait pour travailler dans les processus:
Vous devez utiliser la mémoire partagée, mutex processus partagé et variable de condition, gérer les processus qui meurent avec le mutex verrouillé (-> mutex robuste) ... Ce qui est un peu exagéré ici, tout ce dont j'ai besoin, c'est que les différentes instances ne soient pas programmées en même temps et que l'ordre soit plutôt juste.
L'utilisation d'un sémaphores:
static sem_t *sem = NULL;
void fifo_init()
{
sem = sem_open("/server_fifo", O_CREAT, 0600, 1);
if (sem == SEM_FAILED) fail("sem_open");
}
void fifo_lock()
{
int r;
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) fail("clock_gettime");
ts.tv_sec += 5; /* 5s timeout */
while ((r = sem_timedwait(sem, &ts)) == -1 && errno == EINTR)
continue; /* Restart if interrupted */
if (r == 0) return;
if (errno == ETIMEDOUT) fprintf(stderr, "timeout ...\n");
else fail("sem_timedwait");
}
void fifo_unlock()
{
/* If we somehow end up with more than one token, don't increment the semaphore... */
int val;
if (sem_getvalue(sem, &val) == 0 && val <= 0)
if (sem_post(sem)) fail("sem_post");
usleep(1); /* Yield to other processes */
}
La commande est FIFO presque 100%.
Note: Ceci est avec un noyau Linux 4.4, 2.4 peut être différent.
Je suis en présence d'une situation serveur-client et le serveur doit conserver un fichier journal de manière à ne pas interférer avec ses E/S, ce qui signifie qu'un thread de connexion serveur-clent ne peut pas attendre car il attend pour un mutex pour l'échec du journal qu'un autre thread de ce type s'est bloqué. Je pensais à lancer chaque entrée dans un thread séparé "write to logfile" qui peut aller attendre sans interférer avec son fil parent. Les messages dans le fichier journal peuvent être mélangés , mais doivent maintenir une chronologie correcte par connexion, c'est pourquoi j'ai besoin d'une FIFO. – EpsilonVector
Configurer une file d'attente. Les connexions c-s écrivent leurs informations de journal dans la file d'attente.Un thread distinct lit la file d'attente et écrit dans le fichier. Vous devez encore acquérir un verrou sur la file d'attente, mais à moins que vous ne le sachiez, cela ne devrait pas être pertinent. La durée d'acquisition du verrou de la file d'attente sera éclipsée par la lenteur relative des fichiers et des E/S réseau. Puisque n'importe quel thread c-s écrit dans la file d'attente pour que votre sortie de journal soit également en ordre par thread. – Duck
Ouais c'est ce que je voulais éviter de faire (cela nécessiterait plus de changements qu'un verrou FIFIO), mais je suppose que je n'ai plus le choix ... – EpsilonVector