CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多线程问题处理。请教

楼主tanyaliji(努力学习.net)(★)2005-07-11 19:36:44 在 VC/MFC / 进程/线程/DLL 提问

现有一程序。   程序运行时动态创建多个线程。几个线程同时对某一目录下的文件进行操作。操作完毕后对文件进行删除。问题是怎么能保证最后一个对文件操作完毕的线程对文件进行删除。 问题点数:100、回复次数:31Top

1 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-07-11 19:57:09 得分 10

判断其他线程还存活,没有了的话就删除?Top

2 楼tanyaliji(努力学习.net)(★)回复于 2005-07-11 19:59:34 得分 0

线程一直是活着的。比如有2个线程,两个线程一直在工作检测该目录下是否有文件。有则对其进行相关操作。操作完毕后删除文件。Top

3 楼tanyaliji(努力学习.net)(★)回复于 2005-07-11 20:25:06 得分 0

fen不够再加。Top

4 楼qrlvls( 空 气 )回复于 2005-07-11 20:37:04 得分 30

在创建线程时记录一个计数为2,在线程退出时通过互斥操作分别将该计数一1,如果结果为0则删除文件  
   
  int   g_nValue   =   2;  
  CRITICAL_SECTION   g_sCrit;  
   
  {  
  InitializeCriticalSection(&g_sCrit);  
  ...  
  hThread1   =   AfxBeginThread(...,   ThreadProc,   ...  
  hThread2   =   AfxBeginThread(...,   ThreadPorc,   ...  
  ...  
  }  
   
  static   DWORD   WINAPI   ThreadProc(LPVOID   pParam)  
  {  
          ...  
          EnterCriticalSection(&g_sCrit);  
          g_nValue   --;  
          if   (g_nValue   <=   0)  
                DeleteFile(...  
          LeaveCriticalSection(&g_sCrit);  
          if   (g_nValue   <=   0)  
                DeleteCriticalSection(&g_sCrit);  
  }Top

5 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-07-12 02:30:31 得分 0

你可以尝试把文件进行改名,改名成功则可以删除,失败则说明尚在使用Top

6 楼caucyniu(caucy)回复于 2005-07-12 09:16:26 得分 0

加一个全局静态变量记录线程数static   i=0,创建时i+1;推出时-1,Top

7 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-07-12 09:32:15 得分 0

主线程等待最后一个线程操作完毕后再退出Top

8 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-12 10:53:28 得分 0

线程间是需要同步的,最好是用WaitForMultipleObjectsTop

9 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:41:12 得分 0

谢谢楼上的大侠。问题是线程一直在工作。比如有2个线程,两个线程一直在工作检测该目录下是否有文件。有则对其进行相关操作,操作完毕后删除文件。有没有线程同步的例子?Top

10 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:47:38 得分 0

我现在的处理办法是:一个变量delcount,统计线程执行删除操作的次数。另外写了一个函数统计工作线程的个数。  
  if(--)  
  {  
    可以删除;  
    delcount   ++;  
      if(删除操作的次数==工作线程的个数)  
    {  
          删除;  
    }  
    delcount   =   0;//重新赋值  
  }  
  Top

11 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:53:36 得分 0

if(可以删除)  
  {  
      删除操作的次数   ++;  
      if(删除操作的次数==工作线程的个数)  
    {  
          删除;  
          delcount   =   0;//重新赋值  
    }  
     
  }  
  如果有多个文件同时发到目录下的话,回出现问题。Top

12 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-07-12 15:59:52 得分 20

HANDLE   hThreadA[2];   //这是两个线程的句柄  
  主线程退出时加以下代码  
  WaitForMultipleObjects(2,   hThreadA,TRUE,   INFINITE);  
  另外注意两个工作线程不要用SendMessage向主线程发消息,MFC有很多函数是这么干的Top

13 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-07-12 18:23:31 得分 10

可以用事件来控制线程操作流程Top

14 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 22:07:02 得分 0

有没有线程同步的例子?  
  Top

15 楼caucyniu(caucy)回复于 2005-07-13 09:05:40 得分 20

线程同步例子:  
  //   临界区结构对象  
  CRITICAL_SECTION   g_cs;  
  //   共享资源    
  char   g_cArray[10];  
  UINT   ThreadProc10(LPVOID   pParam)  
  {  
   //   进入临界区  
   EnterCriticalSection(&g_cs);  
   //   对共享资源进行写入操作  
   for   (int   i   =   0;   i   <   10;   i++)  
   {  
    g_cArray[i]   =   ’a’;  
    Sleep(1);  
   }  
   //   离开临界区  
   LeaveCriticalSection(&g_cs);  
   return   0;  
  }  
  UINT   ThreadProc11(LPVOID   pParam)  
  {  
   //   进入临界区  
   EnterCriticalSection(&g_cs);  
   //   对共享资源进行写入操作  
   for   (int   i   =   0;   i   <   10;   i++)  
   {  
    g_cArray[10   -   i   -   1]   =   ’b’;  
    Sleep(1);  
   }  
   //   离开临界区  
   LeaveCriticalSection(&g_cs);  
   return   0;  
  }  
  ……  
  void   CSample08View::OnCriticalSection()    
  {  
   //   初始化临界区  
   InitializeCriticalSection(&g_cs);  
   //   启动线程  
   AfxBeginThread(ThreadProc10,   NULL);  
   AfxBeginThread(ThreadProc11,   NULL);  
   //   等待计算完毕  
   Sleep(300);  
   //   报告计算结果  
   CString   sResult   =   CString(g_cArray);  
   AfxMessageBox(sResult);  
  }Top

16 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 09:26:20 得分 0

CRITICAL_SECTION应该是保护线程操作的吧?好象不太合适。Top

17 楼gonch(gongch)回复于 2005-07-13 15:28:46 得分 0

觉得实现的机制有问题,为什么用多个线程对同一个文件作类似的操作?完全可以用单一的线程来完成这件事情的。Top

18 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 18:59:45 得分 0

to,,,回复人:   gonch(gongch)    
  我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。Top

19 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 19:31:33 得分 0

to,,,回复人:   gonch(gongch)    
  我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。每个连接都要发数据。Top

20 楼tanyaliji(努力学习.net)(★)回复于 2005-07-14 19:21:38 得分 0

搞定了,  
   
  结帐啦。!Top

21 楼gonch(gongch)回复于 2005-07-15 09:22:06 得分 10

还是更改一下实现机制好一些,再加一个线程读取文件,读完之后删掉。  
  将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。  
  同时计数,当全部线程都发送过去之后再将这段内存清掉Top

22 楼tanyaliji(努力学习.net)(★)回复于 2005-07-15 13:14:51 得分 0

还是更改一下实现机制好一些,再加一个线程读取文件,读完之后删掉。  
  将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。  
  同时计数,当全部线程都发送过去之后再将这段内存清掉  
  /////////////////////////////////////////////  
  to,,,回复人:   gonch(gongch)  
  再加一个线程读取文件,读完之后删掉。将读取的内容保存到内存中,    
  请问由谁来释放内存呢?   释放内存时还是遇到同样的问题..Top

23 楼gonch(gongch)回复于 2005-07-18 08:37:03 得分 0

在新的线程里面加计数器,读取文件之后设为N(N是socket链接的个数),发送成功则计数器减1。当N==0的时候删除文件。注意对计数器操作要加锁Top

24 楼tanyaliji(努力学习.net)(★)回复于 2005-07-26 20:28:56 得分 0

如果同时有两个文件拷贝到目录下还是有问题的。Top

25 楼gonch(gongch)回复于 2005-07-27 14:36:25 得分 0

只有一个线程在读文件,怎么会有问题?!  
  没有明白你的意思,问题出在什么地方?!Top

26 楼tanyaliji(努力学习.net)(★)回复于 2005-07-27 20:10:58 得分 0

多个线程在读.Top

27 楼dirdirdir3(风)回复于 2005-07-28 09:42:16 得分 0

可以加入一个数组结构f[n],f里面为CString   filename,int   count两个变量。  
  当有一个文件拷贝到目录里时,线程读文件,并在f中搜索有没有纪录,没有则添加新纪录,有则count+1.如果count=线程数目,则删除该文件,记录。Top

28 楼gonch(gongch)回复于 2005-07-28 11:09:17 得分 0

多线程在读的话,只能加文件锁或者临界区来互斥了Top

29 楼snakebite2008(3DFX)回复于 2005-07-28 17:18:33 得分 0

我写了一个和楼主差不多的程序,不过我是把收到的数据存到数据库里。Top

30 楼tanyaliji(努力学习.net)(★)回复于 2005-07-28 20:52:28 得分 0

楼上的怎么处理的?Top

31 楼tanyaliji(努力学习.net)(★)回复于 2005-08-02 21:03:17 得分 0

结贴。Top

相关问题

  • Pro *C编程,多线程处理
  • PRO*C多线程处理问题
  • 多线程内在处理问题
  • 300分求 多线程处理问题!?
  • 关于多线程异常处理
  • 多线程处理socket通讯带来的问题!!!!!
  • 多线程只有在多处理机上才有效,对?
  • 在pb中如何实现多线程处理
  • 请教一个在多线程下的数据处理问题?
  • 关于多线程处理---难道又是编译器问题?

关键词

  • 线程
  • 文件
  • scrit
  • 删除
  • nvalue
  • 操作完毕

得分解答快速导航

  • 帖主:tanyaliji
  • horisly
  • qrlvls
  • goodboyws
  • oyljerry
  • caucyniu
  • gonch

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo