请问:多线程代码结果不稳定的有关问题

请教:多线程代码结果不稳定的问题
怎么解释下面这个代码,得到的结果不稳定,有的时候是30,有的时候是50,谢谢。
执行的时候发现,创建的6个线程中有的时候会有3个、4个或5个卡在了while(!g_start);这句了。把它换成while(!g_start) Sleep(1);就正常得很。很想知道为什么,怎么解释这个问题? 谢谢。

#include <process.h>
#include <windows.h>

bool g_start = false;
int g_sum = 0;
CRITICAL_SECTION g_cs;

void testThread(void* num)
{
printf("Thread.%d, execute.\n", (int)num);
//while(!g_start) Sleep(1);
while(!g_start);

EnterCriticalSection(&g_cs);
g_sum += 10;
LeaveCriticalSection(&g_cs);

printf("Thread.%d, exit.\n", (int)num);
}

int main(int argc, char** argv)
{
InitializeCriticalSection(&g_cs);

for (int i = 0; i < 6; ++i)
{
_beginthread(testThread, 0, (void*)i);
}

g_start = true;
Sleep(3000);
printf("sum = %d\n", g_sum);
return 0;
}

请问:多线程代码结果不稳定的有关问题
多线程

------解决方案--------------------

bool g_start = false;
int g_sum = 0;
CRITICAL_SECTION g_cs;

void testThread(void* num)
{
//while(!g_start) Sleep(1);
while(!g_start);
EnterCriticalSection(&g_cs);
g_sum += 10;
LeaveCriticalSection(&g_cs);
}

int main(int argc, char** argv)
{
InitializeCriticalSection(&g_cs);
int success=0,failnum=0;
for(int j=0;j<1000;j++)
{
int time=0;
g_sum=0;
g_start=false;
for (int i = 0; i < 6; ++i)
{
_beginthread(testThread, 0, (void*)i);
}

g_start = true;
while(g_sum!=60)
{
Sleep(100);
if (time++>30){break;}
}
if (g_sum==60){success++;}else
{failnum++;}
if (j%100==0){printf("已运行%d次\n",j);}
}
printf("成功次数:%d\n",success);
printf("失败次数:%d\n",failnum);
system("pause");
return 0;
}

请问:多线程代码结果不稳定的有关问题
------解决方案--------------------
Change 
    bool g_start = false;

To
    volatile bool g_start = false;