首页 > 解决方案 > 实现同步原语的原子的较小类型,例如信号量、互斥体或屏障

问题描述

同步原语可以std::atomic<T>至少使用它们的用户空间部分来实现。使用 C++20 std::atomic<T>::wait,它们只能基于原子。

问题是是否值得使用指针大小的类型或更小的类型。

C++20std::semaphore是一个将最大值作为模板参数传递的示例,因此可以在编译时进行选择,而不是硬编码。


到目前为止我的想法:

我认为在futex使用特定可变大小的平台上,应该只使用该大小。在灵活WaitOnAdress的 Windows 上,有一个空间可供选择。

x64 上的 32 位类型导致更小的编码和相同的效率,所以可能是要走的路。进一步减少到 16 位和 8 位类型显然没有用(16 位类型导致比 32 位类型更大的编码)。

还有一个 Windows on arm 的案例,我不确定。

对于std::semaphore,基于最大值选择整数类型的能力是专门化二进制信号量的副作用,而不是意图。

标签: c++x86armstdatomic

解决方案


推荐阅读