求助把for循环改成多线程

宋大小姐 2013-06-04 11:31:43
Void loop(TComPic *pcPic)
{

for (UInt a = 0; a < pcPic->getNum(); a++)
{
TComDataCU *pcCU = pcPic->getCU(a);
Fun(pcCU);
}
}
为减少时间消耗怎么把函数改造成多线程,让循环体内每个对象都能同步运行,不像for循环一样顺序执行。
...全文
808 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
老猿的春天 2013-06-07
  • 打赏
  • 举报
回复
CreateThread(NULL,0,thread1,NULL,0,NULL); CreateThread(NULL,0,thread2,NULL,0,NULL); 创建线程时 把loop的参数传进去
有新工作否 2013-06-07
  • 打赏
  • 举报
回复
引用 19 楼 blueskysqq 的回复:
[quote=引用 16 楼 yudahai109 的回复:]


  #include <Windows.h>  
  #include <iostream>  
  using namespace std;  

  DWORD WINAPI Thread1(LPVOID lpParmeter);  
  DWORD WINAPI Thread2(LPVOID lpParmeter);  

  int main()  
  {  
      HANDLE hThread1 ;  
      HANDLE hThread2 ;  
     
      
      hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);  
      hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);  

      HANDLE h[2]={hThread1,hThread2};
      WaitForMultipleObjects(2,h,true, INFINITE);//等待所有线程完成后,退出
  
      CloseHandle(hThread1);  
      CloseHandle(hThread2);  
          
      system("PAUSE");  
      return 0;  
  }  
  DWORD WINAPI Thread1(LPVOID lpParmeter)  
  {  
     
	  //1到100的处理过程
	  for each 1 to 100
		  deal(...);

      return 0;  
  }  
  DWORD WINAPI Thread2(LPVOID lpParameter)//thread data  
  {  
	  //100到200的处理过程
	  for each 100 to 200
          deal(...);

      return 0;  
  }  
处理过程自己写
谢谢 我现在也是按照你的思路写的 把200个数据分成两个线程去写 不过领导说要按照另一种思路写:一个线程只处理10个数据 谁先处理完 谁继续再去处理接下的10个数据 ,我不知道怎么写 可否指点一二?[/quote] 我不知道你怎么想的,如果真的按照你所说的,真的不如用单线程。在一个循环体里,意味着 每段线程处理的资源 都是相关的,一个线程访问一个资源之前,必须检查这个资源有没有被使用,这样的效率低到令人发指。 除非你开始就把 资源分割 成10段,然后用10个线程分别处理。否则,没有任何意义。 如果你的资源是动态进来的,那也用不到for循环体。
老猿的春天 2013-06-06
  • 打赏
  • 举报
回复
BYTE *pDataBuf; //大内存 起始地址(指针) 默认每块1024字节 int nCount = 0; HANDLE hMutex; DWORD thread1(LPVOID lparam) { TComPic * pcPic = (TComPic *)lparam; //互斥 while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(nCount == pcPic->getNum() ) return 0; BYTE *pDataTmp = pDataBuf; //起始地址 pDataBuf+=1024; //移动指针指向下一块 //获取要处理的数据 TComDataCU *pcCU = pcPic->getCU(nCount); nCount++; //释放互斥 ReleaseMutex(hMutex); //写数据到一小块buff Fun(pcCU , pDataTmp); } return 0; } DWORD thread2(LPVOID lparam) { TComPic * pcPic = (TComPic *)lparam; while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(nCount == pcPic->getNum() ) return 0; BYTE *pDataTmp = pDataBuf; //起始地址 pDataBuf+=1024; //获取要处理的数据 TComDataCU *pcCU = pcPic->getCU(nCount); nCount++; //释放互斥 ReleaseMutex(hMutex); //写数据到buff Fun(pcCU , pDataTmp); } return 0; } void main() { hMutex = CreateMutex(NULL,FALSE,NULL); CreateThread(NULL,0,thread1,NULL,0,NULL); CreateThread(NULL,0,thread2,NULL,0,NULL); //等待所有线程退出 释放资源 } 创建几个线程自己决定
大尾巴猫 2013-06-06
  • 打赏
  • 举报
回复
引用 19 楼 blueskysqq 的回复:
[quote=引用 16 楼 yudahai109 的回复:]


  #include <Windows.h>  
  #include <iostream>  
  using namespace std;  

  DWORD WINAPI Thread1(LPVOID lpParmeter);  
  DWORD WINAPI Thread2(LPVOID lpParmeter);  

  int main()  
  {  
      HANDLE hThread1 ;  
      HANDLE hThread2 ;  
     
      
      hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);  
      hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);  

      HANDLE h[2]={hThread1,hThread2};
      WaitForMultipleObjects(2,h,true, INFINITE);//等待所有线程完成后,退出
  
      CloseHandle(hThread1);  
      CloseHandle(hThread2);  
          
      system("PAUSE");  
      return 0;  
  }  
  DWORD WINAPI Thread1(LPVOID lpParmeter)  
  {  
     
	  //1到100的处理过程
	  for each 1 to 100
		  deal(...);

      return 0;  
  }  
  DWORD WINAPI Thread2(LPVOID lpParameter)//thread data  
  {  
	  //100到200的处理过程
	  for each 100 to 200
          deal(...);

      return 0;  
  }  
处理过程自己写
谢谢 我现在也是按照你的思路写的 把200个数据分成两个线程去写 不过领导说要按照另一种思路写:一个线程只处理10个数据 谁先处理完 谁继续再去处理接下的10个数据 ,我不知道怎么写 可否指点一二?[/quote] 用一个volatile的全局变量控制。初始设置为0,每个线程加锁后读取这个变量,然后+10,解锁。判断是否超过200,超过的话线程while循环结束。线程内循环处理10次任务。
ztenv 版主 2013-06-06
  • 打赏
  • 举报
回复
void thread(void * param) { while(true) { if(退出信号) { break; } lockresource; //从资源中最多取出十个,须检测边界 unkockresource; for(int i=0;i<10;++i) { //处理取到的十个数据 } } }
大尾巴猫 2013-06-06
  • 打赏
  • 举报
回复
多线程又不是线程越多效率越高的。 对于并行计算来说,几个cpu就几个线程,多了没用。 而且多线程涉及到同步问题,并不是2个线程并行处理就能节约1半的时间。如果同步效率不高,多线程反而比单线程慢。
宋大小姐 2013-06-06
  • 打赏
  • 举报
回复
引用 16 楼 yudahai109 的回复:


  #include <Windows.h>  
  #include <iostream>  
  using namespace std;  

  DWORD WINAPI Thread1(LPVOID lpParmeter);  
  DWORD WINAPI Thread2(LPVOID lpParmeter);  

  int main()  
  {  
      HANDLE hThread1 ;  
      HANDLE hThread2 ;  
     
      
      hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);  
      hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);  

      HANDLE h[2]={hThread1,hThread2};
      WaitForMultipleObjects(2,h,true, INFINITE);//等待所有线程完成后,退出
  
      CloseHandle(hThread1);  
      CloseHandle(hThread2);  
          
      system("PAUSE");  
      return 0;  
  }  
  DWORD WINAPI Thread1(LPVOID lpParmeter)  
  {  
     
	  //1到100的处理过程
	  for each 1 to 100
		  deal(...);

      return 0;  
  }  
  DWORD WINAPI Thread2(LPVOID lpParameter)//thread data  
  {  
	  //100到200的处理过程
	  for each 100 to 200
          deal(...);

      return 0;  
  }  
处理过程自己写
谢谢 我现在也是按照你的思路写的 把200个数据分成两个线程去写 不过领导说要按照另一种思路写:一个线程只处理10个数据 谁先处理完 谁继续再去处理接下的10个数据 ,我不知道怎么写 可否指点一二?
宋大小姐 2013-06-06
  • 打赏
  • 举报
回复
引用 17 楼 u010936098 的回复:
用一个队列,要可以加锁 一个线程(或主线程)循环调用pcPic->getCU(a),结果放入队尾 几个子线程循环从队首取出pcCU并调用Fun。
想法很好 给写点代码呗
我看你有戏 2013-06-05
  • 打赏
  • 举报
回复
可以这样设计,主线程在等,其他线程干完事情了,post消息通知主线程,看下线程间的通信postmessage
宋大小姐 2013-06-05
  • 打赏
  • 举报
回复
引用 13 楼 henry3695 的回复:
要看你干的事情是否可以并行的,可以并行的话就可以考虑多线程,否则没啥意义
可以并行 所以才考虑多线程的
我看你有戏 2013-06-05
  • 打赏
  • 举报
回复
要看你干的事情是否可以并行的,可以并行的话就可以考虑多线程,否则没啥意义
宋大小姐 2013-06-05
  • 打赏
  • 举报
回复
有木有高手指点一下
橡木疙瘩 2013-06-05
  • 打赏
  • 举报
回复
用一个队列,要可以加锁 一个线程(或主线程)循环调用pcPic->getCU(a),结果放入队尾 几个子线程循环从队首取出pcCU并调用Fun。
有新工作否 2013-06-05
  • 打赏
  • 举报
回复


  #include <Windows.h>  
  #include <iostream>  
  using namespace std;  

  DWORD WINAPI Thread1(LPVOID lpParmeter);  
  DWORD WINAPI Thread2(LPVOID lpParmeter);  

  int main()  
  {  
      HANDLE hThread1 ;  
      HANDLE hThread2 ;  
     
      
      hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);  
      hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);  

      HANDLE h[2]={hThread1,hThread2};
      WaitForMultipleObjects(2,h,true, INFINITE);//等待所有线程完成后,退出
  
      CloseHandle(hThread1);  
      CloseHandle(hThread2);  
          
      system("PAUSE");  
      return 0;  
  }  
  DWORD WINAPI Thread1(LPVOID lpParmeter)  
  {  
     
	  //1到100的处理过程
	  for each 1 to 100
		  deal(...);

      return 0;  
  }  
  DWORD WINAPI Thread2(LPVOID lpParameter)//thread data  
  {  
	  //100到200的处理过程
	  for each 100 to 200
          deal(...);

      return 0;  
  }  
处理过程自己写
十八道胡同 2013-06-04
  • 打赏
  • 举报
回复
线程数目不是越多越好,会有一个合适的阈值
有新工作否 2013-06-04
  • 打赏
  • 举报
回复
引用 3 楼 lianshaohua 的回复:
给个思路吧: 1、将for分解为多个任务,多个任务如果没有关联最好了, 2、根据for循环的次数,不必要为每次创建一个线程 ,可创建N个线程,这N个线程共同分担整个for循环(任务分解后分配给N个线程,也可采用动态分配策略)
把数据分成10段,每一小段都for自己内部的数据。。
bluewanderer 2013-06-04
  • 打赏
  • 举报
回复
把编译器的自动并行打开就是了,或者用openmp
ztenv 版主 2013-06-04
  • 打赏
  • 举报
回复
给个思路吧: 1、将for分解为多个任务,多个任务如果没有关联最好了, 2、根据for循环的次数,不必要为每次创建一个线程 ,可创建N个线程,这N个线程共同分担整个for循环(任务分解后分配给N个线程,也可采用动态分配策略)
宋大小姐 2013-06-04
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
CreateThread
我也知道。。 求详细过程
starytx 2013-06-04
  • 打赏
  • 举报
回复
CreateThread
加载更多回复(5)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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