[英]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.