您的位置:首页 > 其它

关于信号量的初次尝试

2013-08-14 13:09 645 查看
按照目前的理解信号量主要用来处理生产者/消费者模式的多线程处理中。

当然对于相同的资源依然要引用临界变量来锁定。

锁部分的相关代码在atlsync.h中均有实现 。

不太理解DirectShow 中BaseClass中关于CMsgThread的设计。

这个类按理来说是设计成一个消费者线程, 生产者则由外部线程来当任。

但其设计貌似又能处理多消费者的情况。

其中GetThreadMsg被实现为:

1. 能够统计在等待的消费者线程个数。

2. 能够返回有效的消费者资源。

但是如果只有其自身一个消费者线程的话根本就不需要统计消费者线程个数。

是否返回有效资源也可以放在线程的routine中来实现。

具体代码如下:

1. 消费者线程调用

CMgThread::GetThreadMsg(CMsg *msg)

{

CMsg *pmsg = NULL;

while(true)//循环直到返回有效资源

{

{

CAutoLock lock(&m_msgQueueLock);

pmsg = m_msgQueue.GetNextMsg();

if(pmsg == NULL)

m_lWaitingThread++;

//统计外部在等在资源的线程个数

//当::ReleaseSemaphore时指定该值

//被等待的线程均可以从WaitForSingleObject中返回 参与消息队列资源的竞争

else break;

}

::WaitForSingleObject(m_hSemaphore, INFINITE);

}

*msg = *pmsg;

delete pmsg;

}

2. 生产者线程调用

void PutThreadMsg(UINT uMsg, DWORD dwMsgFlags,

LPVOID lpMsgParam, CAMEvent *pEvent = NULL)

{

CAutoLock lck(&m_Lock);

CMsg* pMsg = new CMsg(uMsg, dwMsgFlags, lpMsgParam, pEvent);

m_ThreadQueue.AddTail(pMsg);

if (m_lWaiting != 0)

{

ReleaseSemaphore(m_hSem, m_lWaiting, 0); //该调用后 所有block在WaitForSingleObject的消费者线程均可参与资源竞争

m_lWaiting = 0;

}

}

如果消费者线程只有一个,可以简化该模型,在线程routine中循环获取消息,指导获取到有效的消息后才执行消息所指定的具体routine

//TODO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: