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;
}