本文参考morewindows的博文仅仅稍加更改:http://blog.csdn.net/morewindows/article/details/7429155
我们再来深刻的看一下子线程之间竞争的例子:
//线程报数的例子
#include <iostream>
#include <windows.h>
#include <process.h>
int g_count = 0;
unsigned int __stdcall ThreadFun(LPVOID )
{
//std::cout<<"子线程ID:"<<GetCurrentThreadId()<<std::endl;
//线程报数
g_count++;
std::cout<< "子线程ID:" <<GetCurrentThreadId()<< "当前计数值为:" <<g_count<< std::endl ;
return 0;
}
int main ()
{
const int thread_num = 10;
HANDLE handle[thread_num ];
for ( int i = 0 ; i<10; ++i ){
handle[i ] = (HANDLE) _beginthreadex(NULL ,0,ThreadFun, NULL,0,NULL );
}
//为了防止子线程没有执行就结束了.
WaitForMultipleObjects( thread_num,handle ,true,INFINITE);
return 0;
}
我们可以清楚的看到,线程并不是按顺序执行的,线程有竞争机制,谁获得cpu谁就执行.
结果:
1.报数混乱,毫无先后顺序.
2.而且打印语句不是原子的,总是被打断.
我们再来深刻体会一下原子问题的重要性.
#include <iostream>
#include <windows.h>
#include <process.h>
int g_count = 0;
unsigned int __stdcall ThreadFun(LPVOID )
{
Sleep(10);
//std::cout&l