首页
社区
课程
招聘
[求助]求教如何处理这种线程同步问题?
发表于: 2012-4-10 09:34 3819

[求助]求教如何处理这种线程同步问题?

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直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
此贴果断沉了吗~~
2012-4-12 09:53
0
游客
登录 | 注册 方可回帖
返回
//