请问下面这段代码我是只运行线程一,为啥不是运行一次线程1再运行线程2呢?是哪里出错了吗?

#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);后面