提问者:小点点

信号量和内存排序


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


共1个答案

匿名用户

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

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

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

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