`
weihe6666
  • 浏览: 440215 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

InterlockedIncrement

阅读更多
InterlockedIncrement[align=center][/align]

InterlockedIncrement函数的作用?为何要用此函数?

看一段MSDN上的说明:
InterlockedIncrement Function

Increments (increases by one) the value of the specified 32-bit variable as an atomic operation.

To operate on 64-bit values, use the InterlockedIncrement64 function.


LONG __cdecl InterlockedIncrement(
  __in_out      LONG volatile* Addend
);

Parameters
Addend
A pointer to the variable to be incremented.

Return Value
The function returns the resulting incremented value.

Remarks
The variable pointed to by the Addend parameter must be aligned on a 32-bit boundary; otherwise, this function will behave unpredictably on multiprocessor x86 systems and any non-x86 systems.

The interlocked functions provide a simple mechanism for synchronizing access to a variable that is shared by multiple threads. This function is atomic with respect to calls to other interlocked functions.

This function is implemented using a compiler intrinsic where possible. For more information, see the header file and _InterlockedIncrement.

This function generates a full memory barrier (or fence) to ensure that memory operations are completed in order.

InterlockedIncrement函数可以实现对变量的同步操作,当多个线程或进程操作同一个变量时,此函数可以保证对操作的变量同步。

举个例子:如果一个变量 Long value =0;
  首先说一下正常情况下的加减操作:value+=1;
  1:系统从Value的空间取出值,并动态生成一个空间来存储取出来的值;
  2:将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束。
  如果此时有两个Thread ,分别记作threadA,threadB。
  1:threadA将Value从存储空间取出,为0;
  2:threadB将Value从存储空间取出,为0;
  3:threadA将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束,Value=1。
  4:threadB将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束,Value=1。
  最后Value =1 ,而正确应该是2;这就是问题的所在,InterLockedIncrement 能够保证在一个线程访问变量时其它线程不能访问。

分享到:
评论

相关推荐

    os_example.rar_InterLockedIncrement_event_vc6.0

    标题“os_example.rar_InterLockedIncrement_event_vc6.0”表明这是一个关于操作系统示例的压缩包,其中涉及到的关键技术包括“InterLockedIncrement”和“Event”,并且这个示例是在Visual C++ 6.0环境下编译的。...

    易语言原子锁与许可区比较

    易语言原子锁与许可区比较源码,原子锁与许可区比较,线程,线程2,InterlockedDecrement,InterlockedIncrement,WaitForSingleObject,CloseHandle

    Windows下实现的读写锁(VS2008环境)

    这些函数包括InterlockedIncrement、InterlockedDecrement、InterlockedExchange等,它们确保了在多线程环境下对32位值的增加、减少或替换操作的原子性,避免了数据竞争的问题。 在实现读写锁时,我们需要两个关键...

    os_example.rar_信号量_进程同步

    - 同步机制:除了信号量,还包括互斥锁、条件变量、事件(Event)、自旋锁(如Mutex和CriticalSection)、原子操作(如InterlockedIncrement)等。 3. **Event.cpp**: - Windows操作系统中,事件对象是另一种...

    windows c++ 原子操作例子

    - **InterlockedIncrement**:原子递增操作,用于增加一个整型变量的值。 - **InterlockedDecrement**:原子递减操作,用于减少一个整型变量的值。 - **InterlockedExchange**:原子交换操作,用于将变量的值替换...

    多和编程试验-项目三

    最后,我们用InterlockedIncrement替换临界区,以避免同步开销,这将执行时间再次缩短至4.45s,加速比达到了15.13,充分展示了优化代码的重要性。 通过这两个实验,我们可以得出结论,多线程编程中,正确地识别性能...

    DCOM-Based Sharing Object between processes Demo In Delphi

    if InterlockedIncrement(FManagementCount) = 1 then begin InterlockedDecrement(FManagementCount); Exit; end; Result := self; end; function TManagedObject.Detach : Integer; begin Result := ...

    IT知识库 (Java程序)

    - **`InterlockedIncrement`**:这是一个原子操作,用于在线程间安全地增加共享变量的值。 #### 2. 使用事件对象 `CEvent` ```cpp CEvent g_eventStart, g_eventKill; UINT ThreadProc(LPVOID pParam) { ::...

    应用mfc进行windows多线程编程

    为了避免多线程环境下的数据竞争问题,使用`InterlockedIncrement`函数来确保变量加1的操作不会被其他线程打断。另一种方法是在变量声明前加上`volatile`关键字,如`volatile int var;`,以确保编译器不会将此变量...

    单片机实例303-内部函数intrins.h应用举例.rar

    - `_interlockedIncrement`、`_interlockedDecrement`:原子地增加或减少一个整数值,常用于多线程环境中的计数器操作。 - `_interlockedCompareExchange`:实现无锁的比较并交换操作,用于同步原语。 4. **其他...

    RW.rar_读者 写者

    在Windows中,我们可以使用原子操作(如InterlockedIncrement/Decrement)来实现计数器的增减,确保其在多线程环境下的正确性。 总结,读者优先写者优先问题的解决需要巧妙地结合同步和互斥机制,Windows提供的线程...

    WinAPI (Delphi版)

    InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread ...

    实验4Windows线程互斥同步.pdf

    1. **全局变量**:虽然不是专门设计用于同步的,但可以通过原子操作(如InterlockedIncrement)来实现简单的同步。 2. **事件对象(Event)**:事件是一种可以用来同步线程或者作为线程间通信的信号。它可以设置为...

    SynchronizationFunctions(WindowsOS).pdf

    例如,`InterlockedIncrement`和`InterlockedDecrement`用于递增或递减一个变量,`InterlockedCompareExchange`用于比较并交换值。 7. **一次性初始化(One-Time Initialization Functions)**:确保某个初始化过程只...

    《Win32多线程程序设计》配套代码

    在Windows API中,有一些线程安全的函数,如`InterlockedExchange`和`InterlockedIncrement`,用于原子操作,防止数据竞争。 文件200661322841697可能包含了书中讲解的各种多线程编程案例,如线程创建、同步、通信...

    TestThreadApp.rar

    5. **原子操作(如InterlockedIncrement)**:对于计数类型的同步,原子操作可以在无锁的情况下增加或减少计数,从而跟踪线程状态。 在“TestThreadApp”中,可能采用了以上的一种或多种机制来监控和同步多个线程,...

    howto_interlocked_circles_use_uncleess_zip_

    例如,在Windows API中,有诸如InterlockedIncrement、InterlockedDecrement、InterlockedExchange等函数,它们可以无冲突地增加、减少或交换变量的值。这些函数在处理计数器、信号标志等场景时特别有用。在Linux或...

    操作系统-4.3-Windows线程编程1

    9. **Interlocked*()** 函数系列:如InterlockedIncrement()、InterlockedDecrement()等,提供原子操作,保证在多线程环境下对数据的修改不会出现竞态条件。 二、Windows线程编程示例 以下是一个简单的Windows线程...

    WinCE下多线程编程

    - **互锁函数**:如InterlockedIncrement,用于保证对共享资源的原子访问,确保在多线程环境下变量值的唯一性。 - **事件对象**:用于线程同步,通过等待函数如WaitForSingleObject或WaitForMultipleObjects来控制...

    NT下未公开的多线程读,单线程写的函数

    自定义读写锁通常基于原子操作(如`InterlockedIncrement`、`InterlockedDecrement`)和信号量(如`CreateSemaphore`)来实现。读写锁的基本思路是: 1. **读锁**:当一个线程试图获取读锁时,检查当前是否已有写锁...

Global site tag (gtag.js) - Google Analytics