先把我自己写的小程序贴上再讲解
#include <iostream>
#include "windows.h"
using namespace std;
int cnt = 0;
bool p1 = false;
bool p2 = false;
DWORD WINAPI funproc1(LPVOID lparentet);
DWORD WINAPI funproc2(LPVOID lparentet);
int main()
{
CreateThread(NULL,0,funproc1,NULL,0,NULL);
CreateThread(NULL,0,funproc2,NULL,0,NULL);
while(1)
{
if(p1 && p2)
{
cout<<cnt;
break;
}
}
system("pause");
return 0;
}
DWORD WINAPI funproc1(LPVOID lparentet)
{
for(int i = 0;i<10000;i++)
{
cnt++;
}
p1= true;
return 0;
}
DWORD WINAPI funproc2(LPVOID lparentet)
{
for(int i = 0;i<10000;i++)
{
cnt++;
}
p2 = true;
return 0;
}
各位看官,我是在两个线程中对全局变量cnt都执行一万次++操作,然后输出cnt的结果,经过试验发现,有时候会出现理想中的“20000”,但是很多时候只是个一万多的数,具体一万几的话是随机的,不一定就是多少,这种问题的不可控性才是最可怕的。
来个加锁的,解决一下这个问题:
#include <iostream>
#include "windows.h"
using namespace std;
//互斥锁
HANDLE hMutex1;
int cnt = 0;
bool p1 = false;
bool p2 = false;
DWORD WINAPI funproc1(LPVOID lparentet);
DWORD WINAPI funproc2(LPVOID lparentet);
int main()
{
//创建一个锁
hMutex1 =CreateMutex(NULL,FALSE,NULL);
CreateThread(NULL,0,funproc1,NULL,0,NULL);
CreateThread(NULL,0,funproc2,NULL,0,NULL);
while(1)
{
if(p1 && p2)
{
cout<<cnt;
break;
}
}
system("pause");
return 0;
}
DWORD WINAPI funproc1(LPVOID lparentet)
{
for(int i = 0;i<10000;i++)
{
//没上锁的话就自己锁上,否则等着
WaitForSingleObject(hMutex1,INFINITE);
cnt++;
//解锁
ReleaseMutex(hMutex1);
}
p1= true;
return 0;
}
DWORD WINAPI funproc2(LPVOID lparentet)
{
for(int i = 0;i<10000;i++)
{
//没上锁的话就自己锁上,否则等着
WaitForSingleObject(hMutex1,INFINITE);
cnt++;
//解锁
ReleaseMutex(hMutex1);
}
p2 = true;
return 0;
}
加了锁之后结果就是全是“20000”了。