MFC多线程:开了一个线程却和开了多个线程计算速度一样快,我很苦恼。

xcw_pet 2015-11-08 05:43:17
一个课题:开多个线程计算文件MD5值,但是开了多个线程计算的速率并没有快多少。 到底是哪耗费了时间。
以下是代码,我感觉逻辑上木有很大的错误 ,按思路速率应该会加快很多的。
.h// 头文件
public:
HANDLE handle[max_number];
void FindFile(LPCTSTR szPath);
CListCtrl m_List;
int nItem;

//全局定义
static UINT ThreadProc4(LPVOID pParam);//MD5线程
typedef struct listnode
{ char cFileName[MAX_PATH];
char MD5Num[100];
char sFilePath[1024];
BYTE byteStatus;//0X00 ,0x01

}slistnode;


.cpp// 主要函数。

CList<slistnode,slistnode&>list;//创建链表

void CDemoDlg::OnBnClickedMorethread()
{
//TODO: 在此添加控件通知处理程序
CString str;
long t1=GetTickCount();

m_List.DeleteAllItems();
list.RemoveAll();
LPMALLOC lpMalloc;

if(::SHGetMalloc(&lpMalloc)==NOERROR)
{
char szPath[1024];
char szfilePath[MAX_PATH];
memset(szPath,0,sizeof(szPath));
memset(szfilePath,0,sizeof(szfilePath));

BROWSEINFO path;
path.hwndOwner=GetSafeHwnd();
path.pidlRoot=NULL;
path.lpszTitle=_T("请选择搜索目录");
path.pszDisplayName=szfilePath;
path.ulFlags= BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_EDITBOX |BIF_NEWDIALOGSTYLE;
path.lpfn=NULL;
path.lParam=NULL;
LPITEMIDLIST pItemDList;
if((pItemDList=::SHBrowseForFolder(&path))!= NULL)
{
if(SHGetPathFromIDList(pItemDList,szfilePath))
{

strcpy(szPath,szfilePath);
FindFile(szPath);

for(int i=0;i<5;i++) // 开启多个线程
{
handle[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc4,NULL,0,0);
}

for(int i=0;i<5;i++)
{
WaitForSingleObject(handle[i],INFINITE);
}

/*handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc4,NULL,0,0);
WaitForSingleObject(handle[0],INFINITE);*/ //值开启一个线程


POSITION pos=list.GetHeadPosition();
while(pos!= NULL)
{
CString szFile=_T("");
char MD5[MAX_PATH];
char cFileName[MAX_PATH];
memset(MD5,0,sizeof(MD5));
memset(cFileName,0,sizeof(cFileName));

slistnode szlistPut;
szlistPut=list.GetNext(pos);
szFile=szlistPut.sFilePath;
strcpy(MD5,szlistPut.MD5Num);
strcpy(cFileName,szlistPut.cFileName);
nItem =m_List.InsertItem(0,(LPCTSTR)cFileName,NULL);
m_List.SetItemText(nItem, 1,szFile);
m_List.SetItemText(nItem, 2,(LPCTSTR)MD5);
}

}
lpMalloc->Free(pItemDList);
}
lpMalloc->Release();
}
long t2=GetTickCount();
str.Format("time:%dms",t2-t1);
AfxMessageBox(str);
}

void CDemoDlg::FindFile(LPCTSTR szPath)///历遍文件路径
{
CString strPathFile;
CString strMD5DespositPathFile;
char szFind[1024];
char szFile[1024];
char szTemp[100];
WIN32_FIND_DATA FindFileData;

memset( szFind,0,sizeof( szFind));//数组初始化
memset(szFile,0,sizeof(szFile));
memset(szTemp,0,sizeof(szTemp));

strcpy(szFind,szPath);
strcat(szFind,"\\*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
return;
}

while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//链表,STL,数据内存,sql
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,szPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
FindFile(szFile);
}
}
else
{

strcpy(szFile,szPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);

slistnode szListAdd;
strcpy(szListAdd.sFilePath,szFile);
strcpy(szListAdd.MD5Num,szTemp);
szListAdd.byteStatus=0x00;
strcpy(szListAdd.cFileName,FindFileData.cFileName);
list.AddTail(szListAdd);

}
if(!FindNextFile(hFind,&FindFileData))break;
}
FindClose(hFind);

}
UINT ThreadProc4(LPVOID pParam)//计算MD5线程
{
POSITION pos=list.GetHeadPosition();

CString strTempFile=_T("");

while(pos!=NULL)
{

POSITION oldpos=pos;

slistnode ListGet;
//memset(ListGet.MD5Num,0x00,100);

critical_section.Lock();
ListGet= list.GetNext(pos);

if(0x00==ListGet.byteStatus)
{
ListGet.byteStatus =0x01;

CString strTempFile =ListGet.sFilePath;
char*MD5Num=MD5Count((char *)(LPCTSTR)strTempFile,32);
strcpy(ListGet.MD5Num,MD5Num);

list.SetAt(oldpos,ListGet);

}
critical_section.Unlock();
}


return 0;
}
有时候开多个线程计算的相同文件的时间还要多于单个线程的计算时间。。是我的逻辑有问题么?还是线程挂起的时候耗费的时间较多??
...全文
264 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2015-11-09
  • 打赏
  • 举报
回复
critical_section.Lock(); 之类的资源锁定会造成多线程互相等待,如果加锁不当,效率可能比单线程还低
paschen 2015-11-09
  • 打赏
  • 举报
回复
第一,多线程也是有挺大开销的,你计算不是很复杂,多线程可能效率更低 第二,有些底层操作,会被串行化,也就是就算用了多线程,他仍是一个个来的
Dobzhansky 2015-11-09
  • 打赏
  • 举报
回复
多线程不是为了速度而生
sichuanwww 2015-11-09
  • 打赏
  • 举报
回复
参考一下 OpenMP
zgl7903 2015-11-09
  • 打赏
  • 举报
回复
可能耗时并不是在计算上, 而是在文件读取上, 可以用内存数据作为源来测试效果, 加TRACE 测试读数据和计算耗时
赵4老师 2015-11-09
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧