较低级别的 std::atomic<unsigned int>
A lower level of std::atomic<unsigned int>
我有一个struct
,它由两个动态链接库(或共享对象)之间共享的普通旧数据组成。(使用C++11编译)。
其中一个数据成员必须是原子类型,或者更准确地说,我需要能够原子地将前缀++
和--
应用于它。
我担心对成员使用std::atomic<unsigned int>
,因为我认为这将使两个库使用相同的STL实现。
因此,我宁愿使用std::uint32_t
作为成员,并在库中对该成员应用原子操作。只有我不知道如何做到这一点,除了使用互斥锁,它会将性能降低到无法接受的程度。
总之,我该如何做类似的事情
std::int32_t foo;
atomic_increment(foo);
使用标准C++11提供的功能?
你不能。标准C++不尊重在不同共享库中实现不同库的想法(因为它没有后者的概念),因此不认为您的情况存在。因此,没有任何设施来支持它
然而,在实践中,只需使用std::atomic
——在一个真正支持原子的平台上,任何像样的编译器/库都不应该在机器代码中留下任何痕迹。
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- EASTL矢量<向量<int>>连续的
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 定义 uint= "unsigned int" 没有像我在 Visual Studio 中使用 nvcc 时预期的那样应用
- static_cast<unsigned>(签名)与标准::bit_cast<unsigned>(签名)之间有区别吗?
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 为什么在C++负数static_cast如果<unsigned>数字是常数,则不同
- 正确语法,用于统一初始化名称中带有空格的类型的临时,如unsigned int
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- C++ - 从 "int" 到 "unsigned char" 的缩小转换无效
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- "runtime error: addition of unsigned offset to 0x129000a0 overflowed to 0x12900088"
- 按值对 std::unordered_map<std:::string, std::atomic<unsigned int>> 进行排序
- 无法从'unsigned short [9]'转换为'char []'