|
|
1
0
只要做
|
|
2
2
嗯,这是一块石头和一个坚硬的地方。原子增量是一个繁重的平台实现细节。这就是为什么长typedef首先存在的原因。未来20或50年后的一些操作系统可能会重新定义这种类型。例如,当256位内核很常见并且原子增量的工作方式不同时。谁知道呢。 如果您想编写真正的可移植代码,那么应该使用真正的可移植类型。喜欢长。让它工作,而不是你的工作,将是微软的负担。 在很长一段时间内,它将是一个32位整数,我建议您不要担心它。 |
|
|
3
1
您也可以将类型更改为long,留下可移植性,因为整个“互锁”原子操作系列也 非便携式 . 顺便说一句,作为旁注,我认为interlocked支持整数重载。也许这只是在.NET中。 |
|
|
4
1
好,
…并将指向此类类型的指针安全地传递给
|
|
|
5
0
有趣的是, InterlockedExchange -需要很长时间的Windows API*和 _InterlockedExchange 一个MSVC编译器内部函数,需要很长的时间*。 因为已经调用了可移植性,我还将在 GCC atomic intrinsics . 然而,这一点是可以理解的:MSVC使用ILP32LLP64 data model 对于32位构建,LLP64对于64位构建。基于gcc的工具链(如mingw)确实存在于Windows中,并且可以很好地实现lp64模型——这会带来有趣的结果!例如“long”是64位,但long是32位。 如果你坚持使用微软编译器,那就不必担心了。 因此,综上所述: 1。要传递的值必须用“volatile”限定。 2。因为您(a)使用32位数量(这是您的要求)和(b)使用显式32位形式的interlockedxxx api-它的100%安全,只做血腥的强制转换,并用它来完成:interlockedincrement将在所有位大小的32位值上操作,您的变量将显式32位在所有位大小上-ev使用不同的数据模型。 演员阵容是安全的,不要无缘无故把事情复杂化。 |
|
|
6
0
Hans Passant 表达得很好:
这就是实现提供特定于类型的重载的原因。
理论上,每个互锁功能都可以通过使用完全开放的锁来实现,而完全开放的锁又依赖于平台的具体特性:-),但是对于目标硬件平台上支持的类型和功能来说,这是一个真正的性能过度杀伤力。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 2 年前 |
|
|
András Takács · Python多线程错误 2 年前 |