Синхронизировать потоки из разных процессов, используя семафор - PullRequest
1 голос
/ 04 мая 2019

У меня проблема с семафором в C. У меня есть родительский процесс и дочерний процесс.Оба могут создавать 3 потока, и я должен отобразить начало и конец потоков, и я должен наложить следующее условие: поток с идентификатором 1 из родительского процесса должен отобразить свое начало после того, как поток с идентификатором 2 из дочернего процесса отобразит свой конец.Я использую семафор, но когда я жду, поток с идентификатором 1 из родительского процесса не остается в семафоре и продолжает отображать начало.Я не могу использовать функцию usleep () или sleep ().

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>


sem_t* s=NULL;

void* function1(void* arg)
{
   int* nrth=(int*) arg;
   sem_t   * s=NULL;

   s=sem_open("mysemaphore",O_EXCL);
   if(s==NULL)
       perror("Error");

   if(*nrth==1)
       sem_wait(s);


   printf("Begin P1, thread %d\n",*nrth);
   printf("End P1, thread %d\n",*nrth);


   sem_close(s);
   return 0;

}



void* function2(void* arg)
{
    int* nrth=(int*) arg;

    sem_t   * s=NULL;
    s=sem_open("mysemaphore",O_EXCL);
    if(s==NULL)
        perror("Error");

    printf("Begin P2, thread %d\n",*nrth);
    printf("End P2, thread %d\n",*nrth);

    if(*nrth==2)
       sem_post(s);

    sem_close(s);

    return 0;
}


int main()
{
   sem_unlink("mysemaphore");
   s=sem_open("mysemaphore",O_CREAT,0644,1);
   if(s==NULL)
      perror("ERROR!");


   pthread_t threads[4];
   int index[4];
   pthread_t threads2[4];
   int index2[4];

   if(fork()==0)
   {

      printf("Begin: process 2 \n");

       for(int i=1; i<=3; i++)
       {
          index2[i]=i;
          pthread_create(&threads2[i],NULL,function2,&index2[i]);
       }
       for(int i=1; i<=3; i++)
       {
          pthread_join(threads2[i],NULL);
       }
       printf("End: process 2 \n");
   }
   else
   {
       printf("Begin: process 1\n");

       for(int i=1; i<=3; i++)
       {
          index[i]=i;
          pthread_create(&threads[i],NULL,function1,&index[i]);
       }

       for(int i=1; i<=3; i++)
       {
           pthread_join(threads[i],NULL);
       }
       printf("End: process 2 \n");

       wait(NULL);
   }
   return 0;
}

1 Ответ

1 голос
/ 04 мая 2019

Вы уничтожаете свой семафор в function1() и function2(), когда вызываете sem_destroy(), после чего поведение этого семафора не определено.Это может быть вашей самой большой проблемой.

Вместо этого вы должны использовать sem_close() после того, как закончите использовать семафор, полученный из sem_open().

...