因为这几天在学线程 所以用到cout输出 结果cout的输出 的数据是混乱的。
后来上网 找了下 网上说 cout没有线程安全,printf有线程安全。
然后我就把cout换成了 printf 进行输出数据,结果还是一样 还是会有个别的数据混乱。
后来又苦苦的上网找了半天才找到 了临界区。
CRITICAL_SECTION 用之前 要初始化InitializeCriticalSection ,
数据前 EnterCriticalSection 进入临界区,数据后 LeaveCriticalSection临界区 ,感觉就像 Com库中的 CoInitialize CoUninitialize 用单线程方式创建。
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI MyThread(LPVOID lpParameter);
DWORD WINAPI MyThread1(LPVOID lpParameter);
int index=0;
int tickets=10000; //票数
CRITICAL_SECTION g_CS; //定义一个临界区
int main()
{
// DWORD id;
InitializeCriticalSection( &g_CS ); //对临界区初始化
HANDLE hwnd=CreateThread(NULL,0,MyThread,NULL,0,NULL);
HANDLE hwnd1=CreateThread(NULL,0,MyThread1,NULL,0,NULL);
CloseHandle(hwnd);
CloseHandle(hwnd1);
Sleep(400000);
return 0;
}
DWORD WINAPI MyThread(LPVOID lpParameter)
{
while(true)
{
if(tickets>0){
//进化临界区
EnterCriticalSection( &g_CS );
//cout<<"thread 1 sell ticket:"<<tickets--<<endl;
printf("thread 1 sell ticket :%d\n",tickets--);
LeaveCriticalSection( &g_CS );
//离开临界区
}
else
break;
//Sleep(100);
}
return 0;
}
DWORD WINAPI MyThread1(LPVOID lpParameter)
{
while(true)
{
if(tickets>0){
//进化临界区
EnterCriticalSection( &g_CS );
//cout<<"thread 2 sell ticket:"<<tickets--<<endl;
printf("thread 2 sell ticket :%d\n",tickets--);
LeaveCriticalSection( &g_CS );
//离开临界区
}
else
break;
//Sleep(100);}
}
return 0;
}