• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++多线程环境下注意共享资源的释放顺序

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  比如我现在写一个多线程下载程序,包含DownloadTask、HttpDownload两个类。

class DownloadTask
{
     //省略n行代码
public:
int m_threads;//需创建的线程总数 CCriticalSection m_cs;
//临界区
void Stop(); }; class HttpDownload { //省略n行代码
HttpDownload(DownloadTask* task): m_task(task) { } public:
DownloadTask* m_task;
void Start();//开始下载 }

  每一个HttpDownload对象都是一个线程的执行单元,同一个任务下的所有线程共享同一个DownloadTask对象中的所有资源。如果这样编写下载程序:

//在某一个函数中
{
    DownloadTask* myTask =  new DownloadTask()
    HttpDownload* download = new HttpDownload(myTask);
    for(int i = 0; i < myTask->m_threads; ++i)
        AfxBeginThread(downloadThreadFun, download);
    return 0;
}

UINT downloadThreadFun(LPVOID lParam)
{
    auto_ptr<HttpDownload> pDownload((HttpDownload*)lParam);
    pDownload->Start();
    return 0;
}

void SetStop(DownloadTask* task)
{
task->Stop();
delete task;
}

  在某一时刻,比如用户点击停止下载时,我们就需要delete掉这个DownloadTask对象。但是如果当前还有线程在运行,这样delete掉就会影响这些线程,直接导致程序出错。

  所以,必须在delete DownloadTask对象前确定此下载任务中所有线程已经停止。于是可以这样写:

class DownloadTask
{
     //省略n行代码
public:
    int m_threads;//需要创建的线程总数
    CCriticalSection m_cs;//临界区
    int m_currentThreads;//当前运行的线程数
    void Stop();
};

UINT downloadThreadFun(LPVOID lParam)
{
      auto_ptr<HttpDownload> pDownload((HttpDownload*)lParam);
      CSingleLock singleLock(&pDownload->m_task->m_cs);
      pDownload->Start();
      singleLock.Lock()
      --pDownload->m_task->m_currentThreads;
      return 0;
}

void SetStop(DownloadTask* task)
{
     CSingleLock singleLock(&task->m_cs);
     task->Stop();
     singleLock.Lock();
     if(task->m_currentThreads == 0)
        delete task;
     return 0;
}

  这样就保证在所有线程已经结束时才delete掉这个任务的DownloadTask对象。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#得到CPU的序列号、硬盘序列号、网卡序列号发布时间:2022-07-13
下一篇:
在C#中调用控制台程序发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap