多线程共用全局变量可能存在的威胁

先把我自己写的小程序贴上再讲解

#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”了。

猜你喜欢

转载自blog.csdn.net/u011263315/article/details/52931587
今日推荐