06 临界区

1 线程安全问题
每个线程都有自己的栈,而局部变量是在栈中的,这就意味着每个线程都有一份自己的局部变量, 如果线程只使用局部变量,那就不存在线程安全问题;如果多线程访问全局变量,则存在安全问题;
2.临界资源
一次只允许一个线程使用的资源我们将它叫做临界资源;
3.临界区
访问临界资源的那段程序我们称为临界区;
4.简单的临界区使用示例

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

INT g_dwTickets = 10;
CRITICAL_SECTION cs;

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	if (g_dwTickets > 0){
		//进入临界区
		EnterCriticalSection(&cs);
		while (g_dwTickets > 0){
			printf("还有:%d张票\n", g_dwTickets);
			g_dwTickets--;
			printf("卖出一张,还有:%d张\n", g_dwTickets);
		}
		//离开临界区
		LeaveCriticalSection(&cs);
	}
	return 0;
}

int main()
{
	HANDLE hThreadArr[2];
	INT n = 10;
	
	//初始化临界区
	InitializeCriticalSection(&cs);
	hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	hThreadArr[1] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	//等待多个对象,第一个参数为个数,第二个为句柄数组,状态标志等
	//待一个还是所有,最后一个参数为超时时间
	WaitForMultipleObjects(2, hThreadArr, TRUE, INFINITE);
	
	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);
	getchar();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/84845784