一、线程安全问题
每个线程都有自己的栈,而局部变量是存储在栈中的,这就意味着每个线程都有一份自己的“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题。
#include "stdafx.h"
#include "windows.h"
int ticket = 10;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while(ticket > 0)
{
printf("还有%d张票\n",ticket);
ticket--;
printf("卖出一张,还有%d张\n",ticket);
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE ArrhThread[2];
ArrhThread[0] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
printf("线程结束 ");
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
getchar();
return 0;
}
二、解决思路
三、临界区实现之线程锁:
1、创建全局变量
CRITICAL_SECTION cs;
2、初始化全局变量
InitializeCriticalSection(&cs);
3、 实现临界区
EnterCriticalSection(&cs);
//使用临界资源
LeaveCriticalSection(&cs);
#include "stdafx.h"
#include "windows.h"
int ticket = 10;
CRITICAL_SECTION cs; //创建临界区
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
EnterCriticalSection(&cs);//使用
while(ticket > 0)
{
printf("还有%d张票\n",ticket);
ticket--;
printf("卖出一张,还有%d张\n",ticket);
}
LeaveCriticalSection(&cs);//释放
return 0;
}
int main(int argc, char* argv[])
{
HANDLE ArrhThread[2];
InitializeCriticalSection(&cs);//初始化临界区
ArrhThread[0] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
printf("线程结束 ");
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
getchar();
return 0;
}