// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
volatile long g_nLoginCount; //登录次数
unsigned int __stdcall Fun(void *pPM); //线程函数
const int THREAD_NUM = MAXIMUM_WAIT_OBJECTS; //启动线程数
unsigned int __stdcall ThreadFun(void *pPM)
{
Sleep(100); //some work should to do
///g_nLoginCount++;
InterlockedIncrement(&g_nLoginCount);
Sleep(50);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 原子操作
long a = 0;
cout << InterlockedIncrement(&a) << endl; // 1 InterlockedIncrement returns the incremented value.
cout << InterlockedDecrement(&a) << endl; // 0 InterlockedDecrement returns the decremented value.
cout << InterlockedExchangeAdd(&a,5) << endl; // 0 InterlockedExchangeAdd returns the original value of the Addend variable when the call occurred.
cout << a << endl; // 5
cout << InterlockedExchange(&a,99) << endl; // 5 InterlockedExchange returns the value of the variable at Target when the call occurred.
g_nLoginCount = 0;
HANDLE handle[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++)
handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); // (note first param) The number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS. This parameter cannot be zero.
printf("有%d个用户登录后记录结果是%d\n", THREAD_NUM, g_nLoginCount);
return 0;
}