Блокировка семафоров в C проблема sys / sem - PullRequest
1 голос
/ 29 апреля 2010

РЕДАКТИРОВАТЬ: Это мир кода довольно хорошо (так что возьмите его в качестве примера семафоров;). Ошибка в моей программе была в другом месте - найдена моим другом.

У меня проблема с моими функциями. Иногда два процесса входят в критическую секцию. Я не могу найти проблему в этом после того, как я потратил 10 часов на отладку. На что я должен стремиться? Есть ли возможность иметь бутон в этом куске кода?

    // lock semaphore
    static int P(int sem_id)
    {
        struct sembuf sem_b;
        sem_b.sem_num = 0;
        sem_b.sem_op = -1; /* P() */
        sem_b.sem_flg = 0;
        if (semop(sem_id, &sem_b, 1) == -1) {
              // error
                 return(0);
        }
        return(1);
    }

    // unlock semaphore
    static int V(int sem_id)
    {
        struct sembuf sem_b[1];
        sem_b.sem_num = 0;
        sem_b.sem_op = 1; /* V() */
        sem_b.sem_flg = 0;
        if (semop(sem_id, &sem_b, 1) == -1) {
              // error
            return(0);
        }
        return(1);
    }

    static int set_semval(int sem_id)  {
        // set to 1 (opened semaphore)
        if (semctl(sem_id, 0, SETVAL, 1) == -1) {
              // error
            return(0);
        }
        return(1);
    }

    static int get_val(int sem_id)
    {
        union semun sem_union;
        //sem_union.val = 0; ?
        return semctl(sem_id, 0, GETVAL, sem_union);
    }

Цикл действия:

// semaphores init
int mutex;
if ((mutex=semget(key+2, 1, 0666))>=0) {
    // semaphore exists
    fprintf(stderr,"semaphore exists for key %d\n", key+2);
}

if ((mutex=semget(key+2, 1, 0666 | IPC_CREAT)) == -1) { 
    exit(EXIT_FAILURE);
}
if (!set_semval(mutex)) {
    exit(EXIT_FAILURE);
}
fork()    // some times with good conditionals

// in some children
while(1) {
        P(mutex);   
        assert(get_val(mutex)==0); // always ok
        action();  // sometimes made by two processes at same time - fault
        V(mutex);
}   

Пожалуйста, не стесняйтесь редактировать мой вопрос.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

Так что ошибка была в другом месте ...

0 голосов
/ 30 апреля 2010

в вашем «цикле действий», что вы делаете, если ваш семафор не существует?

в настоящее время ваш третий параметр для полугета равен 0666 или константе PERMISSION_RW. Вы можете использовать:

shmget (ключ, 1, PERMISSION_RW | IPC_CREAT);

таким образом, если ваш семафор не существует, он создаст его.

...