当前位置: 首页 > 知识库问答 >
问题:

信号量和内存排序

郑向阳
2023-03-14

来自C++20的std::counting_semaphore的行为是否类似于互斥/原子操作?即semaphore.acquire()是获取操作(关于内存排序)吗,semaphore.release()是释放操作吗?

共有1个答案

公西光华
2023-03-14

获取和释放内存操作最终定义了执行之间的“发生在之前”关系,而正是“发生在之前”关系允许观察副作用。

counting_semaphore::release通过声明release调用“强烈发生在”任何try_acquire(所有形式的acquire都是基于它构建的)观察此release语句的效果的try_acquire语句之前,从而绕过了acquire/release语义。

在调用try_acquire以观察效果的结果之前强烈发生。

这样就提供了acquire所需的所有同步,以便能够观察到release调用的副作用。

 类似资料:
  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:

  • 我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?

  • 我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c

  • null 有3个信号量:互斥-初始化为1满-初始化为0空-初始化为n(而n是管道中的“字节”数) 消费者代码: 生产者代码: 如有任何帮助,不胜感激,谢谢!