C++多线程之_beginthread与_beginthreadex

3 篇文章 0 订阅

标准C运行时库函数,需要包含头文件process.h。

创建线程

uintptr_t _beginthread( 
   void (__cdecl *start_address)(void* fun),//线程执行函数,__cdecl
   unsigned stack_size,                     //线程的堆栈大小,0,默认大小(1M)
   void *arglist                            //线程执行函数的参数
);

uintptr_t _beginthreadex(
   void *security,        //安全属性,NULL,默认安全属性
   unsigned stack_size,   //线程的堆栈大小,0,默认大小(1M)
   unsigned (__stdcall *start_address)(void* fun), //线程执行函数,__stdcall
   void *arglist,         //线程执行函数的参数
   unsigned initflag,     //线程的初始状态,,0:立即执行;CREATE_SUSPENDED:挂起
   unsigned *thrdaddr     //返回线程的ID
);

1、_beginthread错误返回-1,_beginthreadex错误返回0。
2、这两个API都可以创建线程,但_beginthreadex比_beginthread更安全些。MSDN上的解释大概是这样的:用_beginthread创建线程时,如果线程执行函数瞬间结束,可导致_beginthread返回线程句柄无效或是另一个线程的句柄。同时,_beginthreadex创建的线程初始状态可以为挂起,这样能更好地控制线程状态。

在执行函数中结束线程

void _endthread(void);

void _endthreadex(unsigned retval);

1、这两个API在线程执行函数中调用,会立即结束线程。若在执行函数外调用,不会结束线程。
2、_endthread和_endthreadex都会释放线程的资源,比如thread local storage(TLS)。但_endthreadex不会释放线程句柄,需要手动调用WIN32API CloseHandle释放。
3、线程执行函数返回后,会自动调用_endthread或_endthreadex。

_endthread或_endthreadex导致的内存泄漏

调用_endthread后,线程执行函数结束。但它没有释放在执行函数中new的内存,同时,对于在函数中定义的类对象,它的析构函数不会执行。举一个例子,如果有个类是这样定义的,在构造函数中new了内存,并在析构函数中释放。很显然,内存泄漏。

代码示例

class MyClass
{
public:
	MyClass(){cout << "MyClass enter" << endl;}
	~MyClass(){cout << "MyClass exit" << endl;}
};

void fun1(void* param)
{
	MyClass mycl;
	_endthread();//观察注释这行代码和不注释,的输出结果
}

int main()
{
	_beginthread(fun1, 0, NULL);
	getchar();
	return 0;
}

输出
注释_endthread()时:
MyClass enter
MyClass exit

不注释时:
MyClass enter

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值