-
-
[求助]求教如何处理这种线程同步问题?
-
发表于:
2012-4-10 09:34
3819
-
有两个线程,A 和 B。
A 线程负责监视CPU ,当CPU使用率大于 40%时,A 线程运行AStart.bat脚本 20秒,然后使用Stop.bat脚本结束AStart。
B 线程每10分钟运行5分钟BStart.bat脚本,然后使用与A相同的Stop.bat脚本结束BStart。
但是AStart和BStart在同一时间只能运行着一个,并且Stop不会判断此时运行着那个Start而只是简单的结束运行着的bat。
AStart比BStart有更高的优先级,即,如果BStart已运行,而此时CPU使用率大于40%,则在A线程中会结束BStart(用Stop.bat),并运行AStart。当AStart在运行的时候,即使B线程运行BStart的时间到了也不允许运行。
我使用了Event来处理这个同步,但不大确定是否真正保险:
m_hEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
BOOLownerShip=false;
ThreadA()
{
while(true)
{
if(GetCPUUseage()>40)
{
DWORDstatus;
status=WaitForSingleObject(m_hEvent,0);
if(status==WAIT_OBJECT_0)
{
ResetEvent(m_hEvent);
ownerShip=true;
AStart();
Sleep(20*1000);
StopETWTrace();
ownerShip=false;
SetEvent(m_hEvent);
}
else
{
PulseEvent(m_hEvent);
ownerShip=true;
Stop();
AStart();
Sleep(20*1000);
Stop();
ownerShip=false;
SetEvent(m_hEvent);
}
}
}
}
ThreadB()
{
while(true)
{
DWORDstatus;
status=WaitForSingleObject(m_hEvent,0);
if(status==WAIT_OBJECT_0)
{
ResetEvent(m_hEvent);
BStart();
status=WaitForSingleObject(m_hEvent,60*1000*5);
if(status==WAIT_TIMEOUT&&ownerShip==false)
{
SetEvent(m_hEvent);
Stop();
}
Sleep(60*1000*5);
}
}
}
请问这样行吗?是否有更好的解决方案?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课