关于信号量的初次尝试
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
当然对于相同的资源依然要引用临界变量来锁定。
锁部分的相关代码在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
相关文章推荐
- 关于HTML form accept-charset 属性的若干尝试
- 初次尝试
- 操作系统中关于信号量操作的代码示例(Linux + windows)
- 关于“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的解决
- 关于信号量sem_wait的整理(转)
- 正则表达式——初次尝试
- 关于construct2的一位初学者的尝试
- 4.12 关于第一次尝试的考试。
- 关于三语 (简体、繁体、英语) 切换的尝试
- 关于按键精灵的初次学习
- 关于信号量与线程互斥锁的区别与实现
- 关于16位的OS尝试(1)
- Hybrid应用引擎AppCan学习笔记——初次尝试
- 由表单验证说起,关于在C#中尝试链式编程的实践
- 黑马程序员——System.in.read()初次尝试
- Android 关于后台杀死App之后改变服务器状态的一些尝试
- 初次尝试用devc++ 写自定义头文件 遇到的问题
- 关于分页的一次失败的尝试
- 关于linux信号量的SEM_UNDO标志(防止死锁)