如何正确使用“__beginthreadex”?
Posted
技术标签:
【中文标题】如何正确使用“__beginthreadex”?【英文标题】:How to use "__beginthreadex" correctly? 【发布时间】:2012-06-16 16:09:14 【问题描述】:我使用的是VC2010,编写如下代码来测试“__beginthreadex”
#include <process.h>
#include <iostream>
unsigned int __stdcall threadproc(void* lparam)
std::cout << "my thread" << std::endl;
return 0;
int _tmain(int argc, _TCHAR* argv[])
unsigned uiThread1ID = 0;
uintptr_t th = _beginthreadex(NULL, 0, threadproc, NULL, 0, &uiThread1ID);
return 0;
但是没有任何东西打印到控制台。我的代码有什么问题?
【问题讨论】:
我为此添加了一个 C++ 语言标签。如果是别的,请纠正。 【参考方案1】:您的主例程立即退出,导致整个进程立即关闭,包括作为该进程一部分的所有线程。它怀疑你的新线程甚至有机会开始执行。
处理此问题的典型方法是使用WaitForSingleObject 并阻塞直到线程完成。
int _tmain(int argc, _TCHAR* argv[])
unsigned uiThread1ID = 0;
uintptr_t th = _beginthreadex(NULL, 0, threadproc, NULL, 0, &uiThread1ID);
// block until threadproc done
WaitForSingleObject(th, INFINITE/*optional timeout, in ms*/);
return 0;
【讨论】:
有些程序员不会费心等待一些工作线程,但这是程序员通过在工作线程中隐藏异常来掩盖的错误。所有线程必须在主线程结束之前结束。 @Dialectus: it's not that simple 我认为你误解了我的意思,因为我把线路剪短了。我的意思是说程序员必须确保所有工作线程在主线程结束之前结束。以上是关于如何正确使用“__beginthreadex”?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ctypes 在 python 中正确包装 C API?
如何使 MS Access 直通查询在 SQL Server 中正确运行