Не работает Process-pool после добавления компонента общей памяти с блокировкой мьютекса - PullRequest
1 голос
/ 03 декабря 2011

Я программирую небольшой веб-сервер на C, который должен обслуживать несколько клиентских запросов с использованием пула процессов. Пул процессов работал нормально, до добавления компонента общей памяти для хранения количества трафика, отправленного сервером. Все запросы обрабатывались разными процессами раньше. Теперь все они обрабатываются одним и тем же процессом. Я не изменил код для fork () дочерних процессов, что меня смущает ..

typedef struct {
    long int traffic;
    pthread_mutex_t muxlock;
} shmem;

/*Creating the shared memory and,setting its size, closing | Initializing the mutex*/
  shm_unlink("/sum_traffic");
  int shmfd = shm_open("/sum_traffic", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); //Creates the shared memory
  ftruncate(shmfd,sizeof(int)*8+sizeof(shmem)); //Sets the size of the shared memory
  shmem *memptr = mmap(NULL, (sizeof(int)*8+sizeof(shmem)), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0); //Maps a pointer for us to work with
  pthread_mutex_init(&(*memval).muxlock,NULL); //Initialize the mutex lock

//Forking 10 worker processes
int i;
for(i=0; i<11;i++){
  if(pid>0){
      pid=fork();
  }
}

if(pid < 0){
    fprintf(stderr, "Error forking, error: %d\n",errno);
    exit(EXIT_FAILURE);
}

//Worker-processes 
while(1)
  if(pid == 0){
     //Accept connection on list_s
     if((conn_s = accept(list_s, NULL, NULL)) < 0){
          fprintf(stderr , "Error calling accept \n");
          exit(EXIT_FAILURE);
      }
    httpRequest request;
    request = parseRequest(getMessage(conn_s)); //Parses the http GET request
    headertraffic=selectHeader(conn_s,request.returncode); //Selects a Header file to send
    currenttraffic=printFile(conn_s,request.filename); //Serves the requested file
    pthread_mutex_lock(&(*memval).muxlock); //Lock the mutex to write to shared memory
    (*memval).traffic=((*memval).traffic+currentdata+headerdata);
    pthread_mutex_unlock(&(*memval).muxlock); // Unlock mutex
        printf("PID: %d\n",getpid());
    (void)close(conn_s);
  }   

Помощь очень ценится!

1 Ответ

2 голосов
/ 03 декабря 2011

Не уверен, что это ваш настоящий код, но некоторая проверка ошибок будет полезна.

Возможно, это не ваша проблема, но способствующим фактором является то, что вы не настроили мьютекс для совместного использования несколькими процессами. Вы не можете использовать атрибуты по умолчанию в pthread_mutex_init(). Вы должны инициализировать атрибут мьютекса с помощью pthread_mutexattr_init () and then call pthread_mutexattr_setpshared () and then call pthread_mutex_init () `.

...