关于InterlockedIncrement系列函数,是不是在多处理器上无效?

Leckun 2016-01-08 10:11:21
程序使用了InterlockedIncrement,在服务器中跑发现Interlocked好像失效了,是不是在多处理器上无效?
MSDN上看到一句,
this function will behave unpredictably on multiprocessor x86 systems and any non-x86 systems.

是不是意思是多处理器或非X86系统中这个函数无效?
...全文
140 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leckun 2016-01-11
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
应该不会, SMP 肯定是实现了高速缓存一致性协议的, MSDN 上好像是说要求地址在 DWORD 边界对齐, 否则行为不可预期。
经检查不是InterlockedIncrement引起的,而是InterlockedIncrement后再使用了这个+1的变量,在多线程的时候就有机率出问题。谢谢。
mLee79 2016-01-08
  • 打赏
  • 举报
回复
应该不会, SMP 肯定是实现了高速缓存一致性协议的, MSDN 上好像是说要求地址在 DWORD 边界对齐, 否则行为不可预期。
赵4老师 2016-01-08
  • 打赏
  • 举报
回复
InterlockedIncrement The InterlockedIncrement function both increments (increases by one) the value of the specified 32-bit variable and checks the resulting value. The function prevents more than one thread from using the same variable simultaneously. LONG InterlockedIncrement( LPLONG lpAddend // pointer to the variable to increment ); Parameters lpAddend Pointer to the LONG variable to increment. Return Values Windows 98, Windows NT 4.0 and later: The return value is the resulting incremented value. Windows 95, Windows NT 3.51 and earlier: If the result of the operation is zero, the return value is zero. If the result of the operation is less than zero, the return value is negative, but it is not necessarily equal to the result. If the result of the operation is greater than zero, the return value is positive, but it is not necessarily equal to the result. Remarks The functions InterlockedIncrement, InterlockedCompareExchange, InterlockedDecrement, InterlockedExchange, and InterlockedExchangeAdd provide a simple mechanism for synchronizing access to a variable that is shared by multiple threads. The threads of different processes can use this mechanism if the variable is in shared memory. The variable pointed to by the lpAddend parameter must be aligned on a 32-bit boundary; otherwise, this function will fail on multiprocessor x86 systems. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winbase.h. Import Library: Use kernel32.lib. See Also Synchronization Overview, Synchronization Functions, InterlockedCompareExchange, InterlockedDecrement, InterlockedExchange, InterlockedExchangeAdd

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧