关于由临界区(criticalsection)控制的多线程问题!
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter);
DWORD WINAPI ThreadProc1(LPVOID lpParameter);
int tickets=100;
CRITICAL_SECTION g_cs;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs);
Sleep(40000);
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while(TRUE)
{
Sleep(1);//后来验证加的
EnterCriticalSection(&g_cs);
if(tickets>0)
{
cout<<"The windows1 sells ticket"<<tickets <<" \n"<<endl;
tickets--;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets>0)
{
cout<<"The windows2 sells ticket"<<tickets <<"\n"<<endl;
tickets--;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return 0;
}
我的机器是双核的,在运行的时候如果在线程DWORD WINAPI ThreadProc(LPVOID lpParameter)不加Sleep(1);
程序偶尔会提示访问冲突。我觉得可能是因为两个线程同时调用EnterCriticalSection(&g_cs);向g_cs里边写数据造成的。于是我在线程一调用EnterCriticalSection(&g_cs);前加了Sleep(1),结果运行十几遍都不会出错,请问是不是临界区在多核的机器不适用啊?!或者是我的程序出错了啊?!
欢迎各位大侠说说自己的看法!
(错误的提示是:critical.exe中的0x7c938fea未处理异常,0xc0000005写入0xc0000010发生访问冲突)
[解决办法]
帮顶
[解决办法]
你在创建thread的时候,中间有一个sleep,一切就ok了
hThread1=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
Sleep(1);
hThread2=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
顺序执行的时候,所消耗的cpu时间片为0 ,双核下你的两个线程是同时运行的,所以会存在访问冲突