C++实现多线程查找文件实例
这篇文章主要介绍了C++实现多线程查找文件实例,对于深入学习C++程序设计有着很好的参考借鉴价值,需要的朋友可以参考下
主要是多线程的互斥 文件 的查找
多线程互斥的框架
复制代码 代码如下:
//线程函数
UINT FinderEntry(LPVOID lpParam)
{
//CRapidFinder通过参数传递进来
CRapidFinder* pFinder = (CRapidFinder*)lpParam;
CDirectoryNode* pNode = NULL;
BOOL bActive = TRUE; //bActive为TRUE,表示当前线程激活
//循环处理m_listDir列表中的目录
while (1)
{
//从列表中取出一个目录
::EnterCriticalSection(&pFinder->m_cs);
if (pFinder->m_listDir.IsEmpty()) //目录列表为空,当前线程不激活,所以bAactive=FALSE
{
bActive = FALSE;
}
else
{
pNode = pFinder->m_listDir.GetHead(); //得到一个目录
pFinder->m_listDir.Remove(pNode); //从目录列表中移除
}
::LeaveCriticalSection(&pFinder->m_cs);
//如果停止当前线程
if (bActive == FALSE)
{
//停止当前线程
//线程数--
pFinder->m_nThreadCount--;
//如果当前活动线程数为0,跳出,结束
if (pFinder->m_nThreadCount == 0)
{
::LeaveCriticalSection(&pFinder->m_cs);
break;
}
::LeaveCriticalSection(&pFinder->m_cs);
//当前活动线程数不为0,等待其他线程向目录列表中加目录
::ResetEvent(pFinder->m_hDirEvent);
::WaitForSingleObject(pFinder->m_hDirEvent, INFINITE);
//运行到这,就说明其他线程唤醒了本线程
pFinder->m_nThreadCount++; //激活了自己的线程,线程数++
bActive = TRUE; //当前线程活了
continue; //跳到while,
}
//从目录列表中成功取得了目录
<span style="white-space:pre"> </span>......................
//if (pNode)
//{
// delete pNode;
// pNode = NULL;
/
UINT FinderEntry(LPVOID lpParam)
{
//CRapidFinder通过参数传递进来
CRapidFinder* pFinder = (CRapidFinder*)lpParam;
CDirectoryNode* pNode = NULL;
BOOL bActive = TRUE; //bActive为TRUE,表示当前线程激活
//循环处理m_listDir列表中的目录
while (1)
{
//从列表中取出一个目录
::EnterCriticalSection(&pFinder->m_cs);
if (pFinder->m_listDir.IsEmpty()) //目录列表为空,当前线程不激活,所以bAactive=FALSE
{
bActive = FALSE;
}
else
{
pNode = pFinder->m_listDir.GetHead(); //得到一个目录
pFinder->m_listDir.Remove(pNode); //从目录列表中移除
}
::LeaveCriticalSection(&pFinder->m_cs);
//如果停止当前线程
if (bActive == FALSE)
{
//停止当前线程
//线程数--
pFinder->m_nThreadCount--;
//如果当前活动线程数为0,跳出,结束
if (pFinder->m_nThreadCount == 0)
{
::LeaveCriticalSection(&pFinder->m_cs);
break;
}
::LeaveCriticalSection(&pFinder->m_cs);
//当前活动线程数不为0,等待其他线程向目录列表中加目录
::ResetEvent(pFinder->m_hDirEvent);
::WaitForSingleObject(pFinder->m_hDirEvent, INFINITE);
//运行到这,就说明其他线程唤醒了本线程
pFinder->m_nThreadCount++; //激活了自己的线程,线程数++
bActive = TRUE; //当前线程活了
continue; //跳到while,
}
//从目录列表中成功取得了目录
<span style="white-space:pre"> </span>......................
//if (pNode)
//{
// delete pNode;
// pNode = NULL;
/
收藏文章
精彩图集
精彩文章