我有不同数量的进程,应该在已经定义的共享内存上写入。我正在尝试使用系统V信号灯。信号量(sem_access)初始化为1。

    sem_access.sem_op = -1;
    semop(sem_access_id, &sem_access, 1);

    info->index++;
    printf ("INDEX= %d\n", info->index);

    sem_access.sem_op = 1;
    semop(sem_access_id, &sem_access, 1);


问题是printf总是打印相同的数字,而不会增加索引。
PS:对不起,我的英语不好,但我是西班牙人。
编辑:如果我插入一个sleep(1)它很好,但我真的我不想睡觉!

最佳答案

提供有关您的代码的更多信息。您遇到什么问题?一旦获得资源还是没有等待,您的流程是否会卡住?

semop()的手册页说:

1)如果sem_opless than zero,则该进程必须具有以下权限:
       semaphore set。因此,如果sem_access.sem_op = -1;当其他进程将该值设为0或大于0时,则只有该进程将访问共享资源。

流程1:
 sem_access.sem_op = -1; //此过程将等待直到条件不成立

进程2:由于在第一个进程中,sem_op的值为-1,因此该进程需要将sem_op的值设置为0或1,这样才能执行其他进程。

sem_access.sem_op = 1;


如semop()的手册页所述,如果sem_op是正整数,则该操作会将this值添加到
       信号量值(semval)。现在sem_op变为-1 + 1 = 0,再次参考semop()手册页“这是一个“ wait-for-zero”操作:如果semval为零,则
       操作可以立即进行”。

希望您有解决问题的想法。

关于c - 通过信号量访问共享内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47657723/

10-12 17:43
查看更多