#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter
);
int tickets = 100;
CRITICAL_SECTION g_cs;
void main() {
InitializeCriticalSection(&g_cs);
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
//進程終止的時候,系統會為這些殘留的對象進行清理工作
//當不再使用線程句柄的時候,將其關閉
//讓這個內核對象的引用計數減一
CloseHandle(hThread1);
CloseHandle(hThread2);
//InitializeCriticalSection(&g_cs);
Sleep(4000);
DeleteCriticalSection(&g_cs);
system("pause");
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE) {
EnterCriticalSection(&g_cs);
if (tickets > 0) {
Sleep(1);
cout << "thread1 sell ticket:" << tickets-- << endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE) {
EnterCriticalSection(&g_cs);
if (tickets > 0) {
Sleep(1);
cout << "thread2 sell ticket:" << tickets-- << endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return 0;
}
运行结果:
thread1 sell ticket:100
thread1 sell ticket:99
thread1 sell ticket:98
.........
thread1 sell ticket:5
thread1 sell ticket:4
thread1 sell ticket:3
thread1 sell ticket:2
thread1 sell ticket:1
多线程的实质是对CPU工作时间片的抢占,在while循环中,Sleep会释放对CPU的利用,但是这时候临界区已经被锁死,其它线程无法再去抢占时间片。而while死循环的执行速率比时间片抢占算法的执行速率快,这就导致在线程1中while死循环一直占用时间片,其它线程很难抢到时间片取执行程序。
可以把sleep放在EnterCriticalSection(&g_cs);前面,或者LeaveCriticalSection(&g_cs);后面