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

解决方案 »

  1.   

    在创建线程时记录一个计数为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);
    }
      

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

    线程同步例子:
    // 临界区结构对象
    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);
    }
      

  8.   

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

  9.   

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

  10.   

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

  11.   

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

  12.   

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

  13.   

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