- 原子操作:自增操作在多线程环境下会出现错误,因为该操作的汇编代码不止一条指令,多条指令的执行就有可能会被打断。Windows 的一套专门进行原则操作的API——Interlocked API。
- 锁。
- 信号量。(内核对象,可进程间共享)
HANDLE h = CreateSemaphore(0, 0, 1, TEXT("smp")); WaitForSingleObject(h, 2000); ReleaseSemaphore(h, 1, 0);
- 互斥量。(内核对象,可进程间共享)
CreateMutex(0, 0, TEXT("mutex"));//创建时可选当前线程是否要占有该锁,若占有就需要当前线程来释放 WaitForSingleObject(hMutex, INFINITE); ReleaseMutex(hMutex);
- 临界区。(全局变量,进程内使用)
CRITICAL_SECTION cs; InitializeCriticalSection(&cs); EnterCriticalSection(&cs); LeaveCriticalSection(&cs);
- 读写锁。
SRWLOCK srw; InitializeSRWLock(&srw); //一旦初始化完成,就可以对写入线程调用AcquireSRWLockExclusive()函数和ReleaseSRWLockExclusive()函数 AcquireSRWLockExclusive(&srw); //...写入数据,写入东西的时候该线程独占,其他任何线程不可进入 ReleaseSRWLockExclusive(&srw); //对于只读线程可以调用AcquireSRWLockShared()函数和ReleaseSRWLockShared()函数,如下 AcquireSRWLockShared(&srw); //..读取数据,如果这时没有写入数据则多个读取线程可以进行 ReleaseSRWLockShared)&srw);
- 条件变量。