gpt4 book ai didi

C 信号量同步

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:04 25 4
gpt4 key购买 nike

我有 2 个程序需要相互通信,第一个程序必须输出第二个程序放入共享内存的内容,但我已经删除了除信号量之外的所有内容,因为同步存在问题。这是一项学校作业,所以我必须完全按照下面显示的方式使用信号量,不要提出任何其他建议,因为我不会使用它。

#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>

int main()
{
int semid;
struct sembuf sobs;
semid=semget(9999,1,IPC_CREAT|0600);
semctl(semid, 0, SETVAL,1);
sobs.sem_num=0;
sobs.sem_op= 0;
sobs.sem_flg=0;
semop(semid,&sobs,1);
/* DO SOMETHING */
sobs.sem_op=1;
semop(semid,&sobs,1);

shmctl(shmid1,IPC_RMID,0);
return 0;
}

第二个程序:

#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>
int main()
{
int semid;
struct sembuf sobs;
semid=semget(9999,1,0600);

sobs.sem_num=0;
sobs.sem_op=-1;
sobs.sem_flg=0;
semop(semid,&sobs,1);
/* DO SOMETHING */
sobs.sem_op=1;
semop(semid,&sobs,1);
shmctl(shmid1,IPC_RMID,0);
return 0;
}

所以问题是,如果我在第二个程序中将 sleep() 放在 DO SOMETHING 之上,第一个仍然会进入临界区,并且它会在第二个之前完成,但第一个必须'在第二个退出之前不进入临界区,我该怎么做才能防止第一个进入?

最佳答案

通常,程序 A 最初应使用 semctl 将信号量设置为 0。然后程序A以sobs.sem_op=-1调用semop,等待信号量。

程序 B 不需要在 “do something” 之前对信号量做任何事情。 (请注意,A 必须先运行,以便在 B 启动之前创建和设置信号量。)B 完成后,它应该通过使用 sobs.sem_op=1 调用 semop 向 A 发出信号

简而言之,A 在“做某事” 之前设置信号量并等待它。 B “做某事” 然后向信号量发送信号以唤醒 A。

关于C 信号量同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23886051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com