关于线程安全退出

news/2024/6/19 3:59:56 标签: thread, delete, byte, 测试, 工作

 

之前的想法是,如果尽量不要在线程中分配内存,这样当线程没有正常退出时,很容易就出现内存泄漏的情况。

所以在这里的test代码也是如此,没有在线程中分配内存,而是在主线程中分配的内存供线程使用。

 

     关于线程正常退出的关键在于:如果在设置了控制线程函数循环的标志位workstatus为false,也需要等待将正在执行的这次循环执行完,才能释放线程中的使用的内存。但是不清楚线程退出了此次的while功能语句的循环需要多长时间,如果时间长了,主线程(可能是用户)不能接受。如果时间短了,在线程还在使用内存时,用TerminateThread()强制退出线程并释放内存,必然造成功能上的缺失,处理数据的不正常,这样的退出方式通常不是我们希望看到的。

     解决办法:在主线程的stop中等待需要结束的分线程中while循环已经退出的同步量Event,如果得到这个同步量Event,这说明我们可以释放内存了,此时线程已经正常退出了。 由系统智能的得到将workstatus置为false后的线程正常退出需要的时间,而不是我们的主观臆断。

 

可能还是从代码中来看,会简单很多:

 

头文件:

#pragma once
#include <afxmt.h>
class CCCThread
{
public:
 CCCThread(void);
 ~CCCThread(void);

public:
 //开始
 int Start();
 //结束
 int Stop();

private:

 LPBYTE         m_pMem;
 UINT static _sThreadFunc(void *_p);//线程函数
 bool               m_workstatus;//工作状态
 CEvent           m_endEvent;//线程是否已经退出循环
 CWinThread *m_pThread;//线程指针

};

 

 

 

 

源文件:

#include "StdAfx.h"
#include "CCThread.h"


CCCThread::CCCThread(void)
{
}


CCCThread::~CCCThread(void)
{
}


int CCCThread::Start()
{
 m_pMem=new BYTE[10000];
 m_workstatus=true;
 m_pThread=AfxBeginThread(_sThreadFunc,this,THREAD_PRIORITY_NORMAL);
 TRACE("Start!");
 return 0;
}

int CCCThread::Stop()
{
 m_workstatus=false;
 WaitForSingleObject(m_endEvent,INFINITE);
 TRACE("Been stopped!");
 delete [ ]m_pMem;
 return 0;
}


UINT CCCThread::_sThreadFunc(void *_p)
{
 CCCThread *pMain=(CCCThread *)_p;
 while(pMain->m_workstatus)
 {
  TRACE("running/n");
 }
 pMain->m_endEvent.SetEvent();
 return 0;
}

 

在main函数中实践测试过,没有问题。如果有什么问题,希望大家提出。


http://www.niftyadmin.cn/n/739386.html

相关文章

php curl常见错误:SSL错误、bool(false)

在命令行中使用curl调用跳过SSL证书检查的方法&#xff0c;需要的朋友可以参考下。 症状&#xff1a;php curl调用https出错 排查方法&#xff1a;在命令行中使用curl调用试试。 原因&#xff1a;服务器所在机房无法验证SSL证书。 解决办法&#xff1a;跳过SSL证书检查。 curl_…

C++虚函数表与对象布局

每个含有虚函数的类有一张虚函数表(vtbl)&#xff0c;表中每一项指向一个虚函数的地址&#xff0c;实现上是一个函数指针的数组。 虚函数表既有继承性又有多态性。每个派生类的vtbl继承了它各个基类的vtbl&#xff0c;如果基类vtbl中包含某一项&#xff0c;则其派生类的vtbl中…

MFC单文档打开文件

打开文件类之间关联 在向导创建的应用程序中&#xff0c;程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。当运行程序后&#xff0c;打开“文件”菜单中的“打开”命令时&#xff0c;应用程序会自动打开相应的“打开”文件通用对话框。之所以有这功能&#xff0c;是…

MySQL数据库中order by的实现 和 by rand() 和优化

转载自淘宝丁奇&#xff01;有同学上周问了个问题 “MySQL数据库里面的order by rand()”是怎么实现的。我们今天来简单说说MySQL数据库里的order by。几种order by的情况 乍一看这个问题好像有点复杂&#xff0c;我们从最简单的case开始看起。 用这个表来说明&#xf…

static关键字-void和void指针-函数指针

static关键字1&#xff0e;作用于变量&#xff1a; 用static声明局部变量-------局部变量指在代码块{}内部定义的变量&#xff0c;只在代码块内部有效&#xff08;作用域&#xff09;&#xff0c;其缺省的存储方式是自动变量或说是动态存储的&#xff0c;即指令执行到变量定义…

linux下安装protobuf教程+示例(详细)

1 在网站 http://code.google.com/p/protobuf/downloads/list上可以下载 Protobuf 的源代码。然后解压编译安装便可以使用它了。 安装步骤如下所示&#xff1a;tar -xzf protobuf-2.1.0.tar.gz cd protobuf-2.1.0 ./configure --prefix/usr/local/protobufmake make check make…

说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

简单来说&#xff1a;JSON是一种数据交换格式&#xff0c;而JSONP是JSON的一种使用模式&#xff0c;是基于JSON的 简单说就是JSON是协议&#xff0c;而JSONP是使用这种协议的一种方法 前言&#xff1a; 由于Sencha Touch 2这种开发模式的特性&#xff0c;基本决定了它原生的数据…

c语言中volatile关键字

volatile关键字是一种类型修饰符&#xff0c;用它声明的类型变量表示可以被某些编译器未知的因素更改。 用volatile关键字声明的变量i每一次被访问时&#xff0c;执行部件都会从i相应的内存单元中取出i的值。 没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存…