繁体   English   中英

如何从共享 memory 中正确获取信号量

[英]How to get correctly the semaphore from shared memory

我有一个库,它写入存储在共享 memory 中的数组中。 现在,我想同步进程,因为会有更多进程可以访问并将元素放入此数组中。 我正在研究信号量,但我不明白为什么我的过程卡住而没有给我任何错误。 如果我在getSemaphoreWrite()releaseSemaphoreWrite()行上发表评论,则该过程在没有信号量的情况下也能正常工作。

图书馆:

void getSemaphoreWrite(){
    int semID = semget(KEY_MB_WRITE, 0,0600);
    struct sembuf sops;
    sops.sem_num = 0;
    sops.sem_op = -1;
    semop(semID,&sops,1);
}
void releaseSemaphoreWrite(){
    int semID = semget(KEY_MB_WRITE, 0,0600);
    struct sembuf sops;
    sops.sem_num = 0;
    sops.sem_op = 1;
    semop(semID,&sops,1);
} 
int addBlock(struct Block block){
    if(sizeMaster >= MAX_MASTER-1) return -1;
    getSemaphoreWrite();
    block.id = sizeMaster +1 ;
    MasterBook[sizeMaster] = block;
    ++sizeMaster;
    printf("After add a block, size: %d",sizeMaster);
    releaseSemaphoreWrite();
    return 0;
}

结构:

struct Transaction {
    int empty;
    char timestamp[30];
    int sender; /* pid user sent */
    int receiver;
    int reward;
    int money;
};

struct Block
{
    int id;
    struct Transaction tr1;
    struct Transaction tr2;
    struct Transaction reward;
};

在主人:

  int semID = semget(KEY_MB_WRITE, 1, IPC_CREAT | 0600);
    if(semID == -1){
        perror("Error in sem: ");
        exit(EXIT_FAILURE);
    }
    semctl(semID, 0, SETVAL, 0);

这是意料之中的。

semctl(semID, 0, SETVAL, 0); call 用值0初始化信号量。 addBlock尝试做的第一件事是减少它。 信号量的全部意义在于阻止使其值为负的过程。

尝试semctl(semID, 0, SETVAL, 1); 在主人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM