C++线程同步之原子操作
所谓的原子操作就是指一个线程对于某一个资源做操作的时候能够保证没有其它的线程能够对此资源进行访问。
原子操作仅仅能够解决某一个变量的问题,只能使得一个整型数据做简单算术运算的时候是原子的。
以下案例需要在Debug模式下测试。
#include<iostream> #include<windows.h> using namespace std; long g_num; DWORD WINAPI ThreadProc1(LPVOID lpParameter) { // InterlockedExchangeAdd 为一个整型变量以原子方式加上一个数 // InterlockedExchange 将一个32位数以原子方式赋值给另外一个数 // InterlockedExchange64 将一个64位数以原子方式赋值给另外一个数 // InterlockedCompareExchange 如果两个数相等,就将另一个数赋值,不相等无效果 for (int i = 0; i < 100000; i++) { // InterlockedIncrement 给一个整形变量自增1 InterlockedIncrement(&g_num); // g_num++; } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { for (int i = 0; i < 100000; i++) { // InterlockedIncrement 给一个整形变量自增1 InterlockedIncrement(&g_num); // g_num++; } return 0; } int main() { HANDLE hThread1 = NULL; HANDLE hThread2 = NULL; hThread1 = CreateThread(0, 0, ThreadProc1, 0, 0, 0); hThread2 = CreateThread(0, 0, ThreadProc2, 0, 0, 0); // WaitForSingleObject 叫做等待函数,他能够等待线程结束,线程结束这个函数才会返回(或者时间到了)否则就阻塞住。 WaitForSingleObject(hThread1, -1); WaitForSingleObject(hThread2, -1); cout << "g_num = " << g_num << endl; getchar(); return 0; }