如何正确使用“__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 中正确运行

mysql索引和正确使用方式

在zc.buildout中,如何安装egg A,然后安装需要egg A才能正确安装的egg B?

加盐密码哈希:如何正确使用