_beginthreadex和_beginthread区别,调用_endthread不会析构局部变量??

2._beginthreadex和_beginthread区别


      _beginthreadex内部会自动调用 _endthreadex.

      _beginthread内部会自动调用_endthread.              

      _endthread内部会自动调用CloseHandle关闭当前Thread内核对象的句柄,所以在用_beginthread 时我们不需要在主线程中调用CloseHandle来关闭子线程的句柄。 
_endthreadex相比_endthread而言更安全。它不会自动关闭当前Thread内核对象的句柄。所以在用_beginthreadex时我们需要用CloseHandle来关闭子线程的句柄。

http://blog.sina.com.cn/s/blog_9635e5ef0101psgk.html


void CJtDevcieSearch::Static_StartReceiveThread(void *arg)
{
CJtDevcieSearch *self = (CJtDevcieSearch *)arg;


std::tr1::shared_ptr<CJtDevcieSearch> m_TmpSelf = self->m_Self;
long use_count = m_TmpSelf.use_count();
self->m_Self.reset();
use_count = m_TmpSelf.use_count();
m_TmpSelf->StartReceiveThread();


// _endthread();  //注意,如该行不注释掉,m_TmpSelf得不到释放 
use_count = m_TmpSelf.use_count();
return;
}
上面是一个由_beginthread创建的线程,如果运行了_endthread();那么m_TmpSelf 得不到释放,还未深究,由谁知道原因吗????

`_beginthreadex` 和 `_beginthread` 这两个 WinAPI 函数在创建线程时,允许你绑定一个回调函数作为新线程的主要入口点。这个回调函数通常是一个 `DWORD WINAPI` 类型的函数,接收一个指向线程参数的 `LPVOID` 参数,并且返回 `DWORD` 值(通常是线程标识符,虽然在实际操作中这通常并不重要)。 **绑定回调函数示例**: 假设我们有一个名为 `ThreadCallback` 的回调函数,它负责执行特定任务: ```cpp #include <Windows.h> // 假设这是一个自定义的回调函数 DWORD WINAPI ThreadCallback(LPVOID lpParameter) { void* data = static_cast<void*>(lpParameter); // 将LPVOID转换为期望的数据类型 // 执行具体的操作,比如处理业务逻辑 std::cout << "Thread Callback: Processing data...\n"; // 完成任务后可以释放资源等 return 0; // 返回值表示成功,一般无需关注 } int main() { // 准备线程需要的数据 int someData = 42; // 使用 _beginthreadex 创建线程并传递回调函数和参数 DWORD threadId; if (::_beginthreadex( nullptr, // 使用默认堆栈大小 0, // 默认优先级 ThreadCallback, // 回调函数指针 reinterpret_cast<LPVOID>(&someData), // 数据指针 0, // 使用默认创建标志 &threadId)) { std::cout << "Thread created with ID: " << threadId << "\n"; // 如果需要等待线程结束,可以使用 WaitForSingleObject WaitForSingleObject(reinterpret_cast<HANDLE>(_beginthreadex), INFINITE); CloseHandle(reinterpret_cast<HANDLE>(_beginthreadex)); // 关闭线程句柄,释放资源 } else { std::cerr << "Failed to create thread." << std::endl; } return 0; } ``` 在这个例子中,`ThreadCallback` 函数会接收到线程启动时提供的数据 `someData`。当线程完成后,你需要关闭线程句柄以防止内存泄漏。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值