Comment puis-je arrêter un thread est en attente d'un sémaphore de l'opération

Je suis en train d'écrire un programme qui utilise la mémoire partagée et les sémaphores ipc. Il y a un processus serveur principal qui crée de la mémoire partagée et les sémaphores. Un nombre quelconque de processus client peut s'attacher à la mémoire partagée et les lire et à écrire, lorsque cela est autorisé. Les sémaphores de fournir le mécanisme de blocage de contrôler les lectures et les écritures. Tout fonctionne bien sauf lorsque je tente de mettre fin à un client. Le sémaphore de bloquer les accès à la mémoire partagée est dans un thread et sur le processus de résiliation, je n'ai aucun moyen de libérer le sémaphore bloc de sorte que le thread s'arrête correctement. Comment pourrais-je aller à ce sujet? C'est pour Linux.

Pour être précis, il y a une shm et deux sems. La première sem blocs d'écriture, et le second bloque la lecture. Lorsqu'un client a quelque chose à écrire, il attend l'écriture sem à 0, alors il définit à 1, écrit, puis définit le lire sem à 0, ce qui libère l'attente du serveur de lire ce que le client l'a écrit. une fois lu le serveur définit l'écriture, à la sem à 0 et que le prochain client en ligne est à écrire. Il se bloque sur une semop appel qui se libère lors de la lecture sem est de 0. Cette semop appel est dans un thread et j'ai besoin de comprendre comment sortir de ce thread correctement avant de laisser le thread principal de résilier.

Voici un exemple de ce que je veux faire, mais ne fonctionne pas (le sommeil se fait passer pour la pendaison de semop appel):

#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void termination_handler (int signum) {
    printf( "Got Signal\n" );
}

void *threadfunc( void *parm ) {
    struct sigaction action;

    action.sa_handler = termination_handler;
    sigemptyset( &action.sa_mask );
    action.sa_flags = 0;

    sigaction( SIGUSR1, &action, NULL );

    printf("Thread executing\n");

    sleep( 100 ); //pretending to be the semaphore

    pthread_exit( NULL );
}

int main() {
    int       status;
    pthread_t threadid;
    int       thread_stat;

    status = pthread_create( &threadid, NULL, threadfunc, NULL );

    if ( status <  0) {
        perror("pthread_create failed");
        exit(1);
    }

    sleep( 5 );

    status = pthread_kill( threadid, SIGUSR1 );

    if ( status <  0 )
        perror("pthread_kill failed");

    status = pthread_join( threadid, (void *)&thread_stat );
    if ( status <  0 )
        perror("pthread_join failed");

    exit( 0 );
}
Veuillez préciser ce que vous entendez par "aucun moyen pour libérer le sémaphore bloc". Pourquoi?
Donc, en mettant de côté le fil-kill question, la vraie question est pourquoi vous bloquer si longue attente sur le partage de l'accès à la mémoire. Vraisemblablement, les clients sont en attente sur le serveur pour configurer l'écriture sem retour à l'endroit où ils peuvent débloquer. Est serveur exécutant certaines tâches ou est-il possible qu'il y ait quelques cas non diagnostiqués de blocage des problèmes avec le design?
eh bien, à élaborer d'autres. il n'y a pas de problème avec la logique ou de la période d'attente. chaque client possède également une shm qui se bloque jusqu'à ce que le serveur écrit quelque chose à ce processus shm, et le serveur a une shm qui se bloque jusqu'à ce qu'un client écrit quelque chose pour que les processus de la shm. de sorte que vous pouvez le voir, lorsque rien ne se passe, tous les clients et le serveur vient de s'asseoir et d'attendre. Je suis en fait enquête à l'aide de stdin ou de la mémoire des files d'attente à la place. Cette méthode originale semble être trop compliqué par rapport à celles d'autres méthodes.
Ah, l'intrigue s'épaissit. 🙂 FWIW, je pense que la shm est un pain PITA pour rien au-delà la plupart du temps à des tâches critiques et dans ce cas, vous êtes en attente d'un lot. Si vous avez le luxe de recodage, Posix MQs sembler comme un bon choix ici. Chaque côté peut écrire leurs données dans une file d'attente sans blocage et ils peuvent utiliser quelque chose comme mq_notify() sur le côté lecture. Sans knowning les détails de l'application (et je soupçonne qu'il y a de plus), il simplifie un certain nombre de choses.
je pense que je suis fait pour y aller avec de la pipe et de s'occuper uniquement de la norme de descripteurs de fichiers. Joué avec lui et il fait le travail et le bien, et est parfaitement simple. Merci pour toute l'aide et l'entrée. Si vous avez des objections à pipe laissez-moi savoir, j'espère que c'est la dernière fois que j'ai recoder cette!

OriginalL'auteur user19745 | 2009-07-17