C 信号量同步

标签 c memory semaphore shared

我有 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/

相关文章:

不使用 sprintf() 将 float 转换为字符串

c++ - 如何将指向成员函数的指针传递给 C 函数?

c# - 读取和写入内存地址以验证不安全代码中的内存分配

c++ - C/C++ 转换为程序集,低级内存行为 : how is it done?

c - 使用 sem_open 初始化信号量

c - 快速 ARM NEON memcpy

c - c 是否跟踪分配的堆内存?

c++ - 为什么这两个整数变量和两个 double 变量(看似)在内存中共享相同的地址?

multithreading - 信号量计数的使用案例

c - POSIX 中 sem_getvalue() 的语义