首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

关于由临界区(criticalsection)控制的多线程有关问题

2012-04-14 
关于由临界区(criticalsection)控制的多线程问题!#include stdafx.h#include windows.h#include iost

关于由临界区(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 ,双核下你的两个线程是同时运行的,所以会存在访问冲突

热点排行