【问题标题】:Using semaphores to avoid race-condition使用信号量来避免竞争条件
【发布时间】:2013-02-20 17:52:04
【问题描述】:

我必须使用进程创建一个竞争条件程序,我也是。现在,我正在尝试使用信号量来解决它。我有两个关键部分,我正在尝试使用我在initStem() 中使用semctl() 创建的信号量来保护它们。 P()V() 递增和递减在其第二个参数中指定的信号量的互斥量。

不幸的是,我的比赛条件似乎仍然存在:我的输出是:

value in parent: 4
value after child exec: 4

什么时候应该:

value in parent: 4
value after child exec: 5

(5 + 1 - 1 = 5...)

这是我的代码:

#define KEY 4567
#define PERMS 0660
#define ID_PROJ "race"
#define NB_SEMAPHORES 1

int initSem(char **argv);
int P(int semid, int semnum);
int V(int semid, int semnum);

int main(int argc, char **argv) {

    int id, pid1;
    int *shared;
    int tmp;

if ((id = shmget(KEY, 2*sizeof(int), IPC_CREAT | PERMS)) == -1) {
    perror("shmget");
    exit(-1);
}

shared=(int *)shmat(id, NULL, 0);
shared[0]=5; // value
shared[1]=initSem(argv); // semaphore id

if ((pid1=fork()) == 0) {
    P(shared[1], 0); // Start critical section
    tmp=shared[0];
    tmp++;
    sleep(2);
    shared[0]=tmp;
    V(shared[1], 0); // End critical section
    exit(0);
}
else {
    P(shared[1], 0); // Start
    tmp=shared[0];
    tmp--;
    sleep(4);
    shared[0]=tmp;
    V(shared[1], 0); // End

    printf("value in parent: %d\n", shared[0]);

    waitpid(pid1, NULL, 0);
    printf("value after child exec: %d\n", shared[0]);
    shmctl(id, IPC_RMID, NULL);
}
}

所以我想知道:我是否正确使用了信号量?我在两个进程中使用相同的信号量是否正确?

编辑:

以下是我用来与信号量交互的 3 个函数:

int initSem(char **argv) {
    int i,semid;
    key_t key=ftok(argv[0], 'P');
    semid=semget(key, NB_SEMAPHORES, IPC_CREAT | PERMS);
    for(i=0 ; i<NB_SEMAPHORES ; i++)
            semctl(key, i, SETVAL, 1);
    return semid;
}

int P(int semid, int semnum) {
    struct sembuf op;
    op.sem_num=semnum;
    op.sem_op=-1;
    op.sem_flg=0;
    semop(semid, &op, 1);
}

int V(int semid, int semnum) {
    struct sembuf op;
    op.sem_num=semnum;
    op.sem_op=1;
    op.sem_flg=0;
    semop(semid, &op, 1);
}

【问题讨论】:

  • 如果您不发布与信号量交互的代码,我无法帮助您处理信号量。
  • 抱歉,我用缺失函数的代码更新了我的问题。
  • 为什么不用经典sem_initsem_postsem_wait
  • 因为我被明确要求使用 semget 和 semctl。

标签: c linux shared-memory semaphore race-condition


【解决方案1】:

确保使用sem_init() 创建信号量,并将pshared 设置为非零

【讨论】:

  • 问题是我正在尝试使用 semget 和 semctl 来实现这一点。我用缺失函数的代码更新了我的问题。
【解决方案2】:

好的,问题出在我使用的initSem

semctl(key, i, SETVAL, 1);

而不是

semctl(semid, i, SETVAL, 1);

否则我的代码是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2010-09-25
    • 2017-12-02
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多