具有 3 个元素的信号量

Posted

技术标签:

【中文标题】具有 3 个元素的信号量【英文标题】:Semaphore with 3 elements 【发布时间】:2018-11-06 21:22:32 【问题描述】:

我需要编写一个代码,该代码将为 2 个进程创建一个。我不想使用叉子。

1 = 预留 1 元素

2 = 预留 2 个元素

3 = 预留 3 个元素

A = 释放 1 个元素

S = 释放 2 个元素

D = 释放 3 个元素

我不知道如何解决保留元素冲突的问题。虽然我写了这样的东西:

#include <stdio.h>
#include <stdbool.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>

int main()

key_t key = ftok(".", 'a');
int semid = semget(key, 3, IPC_CREAT | 0666);
struct sembuf lock[3] =  0, -1, 0, 1, -1, 0, 2, -1, 0 ;
struct sembuf unlock[3] =  0, 1, 0, 1, 1, 0, (2, 1, 0) ;

char input;
semctl(semid, 0, SETVAL, 1);
semctl(semid, 1, SETVAL, 1);
semctl(semid, 2, SETVAL, 1);

while(true)

scanf(" %c", &input);

switch(input)

    case '1':
        semop(semid, lock, 1);
        printf("\nSemaphore Locked\n");
        break;

    case '2':
        semop(semid, lock, 2);
        printf("\n2 Semaphores Locked\n");
        break;

    case '3':
        semop(semid, lock, 3);
        printf("\n3 Semaphores Locked\n");
        break;

    case 'A':
        semop(semid, unlock, 1);
        printf("\nSemaphore Unlocked\n");
        break;

    case 'S':
        semop(semid, unlock, 2);
        printf("\n2 Semaphores Unlocked\n");
        break;

    case 'D':
        semop(semid, unlock, 3);
        printf("\n3 Semaphores Unlocked\n");
        break;

    default:
        printf("\nERROR\n");
        break;




semctl(semid, 0, IPC_RMID);
semctl(semid, 1, IPC_RMID);
semctl(semid, 2, IPC_RMID);

return 0;

【问题讨论】:

【参考方案1】:

如果在没有 fork 的情况下完成,进程将在 semop 上阻塞,并且无法到达 scanf 以获取进一步的输入。如果使用带有 IPC_NOWAIT 的 semop,则不会发生此问题,并且可以从 semop 打印返回。

【讨论】:

以上是关于具有 3 个元素的信号量的主要内容,如果未能解决你的问题,请参考以下文章

有N个并发进程,设s是用于互斥信号量,其初值s=3,当s=-2时,意味着( ),执行一个 P(s)操作

SIGABRT(信号 6)在使用分而治之的数组中查找多数元素时出错

如何找到信号量未锁定的原因

信号与槽

信号与槽

信号与槽