【问题标题】:how to print correctly the handling thread on Windows?如何在 Windows 上正确打印处理线程?
【发布时间】:2010-03-23 06:50:07
【问题描述】:

有人可以告诉我们如何正确打印 windows 中的处理线程吗?实际上我尝试了几种方法,但它没有像 Unix-variant 那样返回正确的数字,例如:

cout << " with thread " << pthread_self << endl;
cout << " with thread " << pthread_self().p << endl;

感谢您的回复:

【问题讨论】:

    标签: c++ c multithreading pthreads


    【解决方案1】:

    GetCurrentThread 返回一个“伪句柄”,而不是有效的线程句柄。您应该改用“GetCurrentThreadId”(或 ::GetCurrentThreadId()),当然还包括 windows.h。

    【讨论】:

    • 感谢您的回复。在 Unix 变体上,使用 GetCurrentThreadId 不是从 2 作为 pthread_self 开始的。有什么办法吗?再次感谢!
    • 如果你需要像 Unix 世界中的“小 ID”,恐怕你必须添加一些代码。一种可能的方法是维护一组从零开始的“本地 ID”,并使用 TlsAlloc/TlsSetValue 将最小的空闲编号绑定到您创建的线程。不是很困难,但很烦人,并且只有当所有线程都是由你创建时才有效(即不是由你无法控制的其他模块)。再见!
    • 我怀疑如果您假设线程标识符的特定值存在隐藏的设计问题。如果你在线程 508 上,那么你不在线程 2 上。也许线程 ID 被用作数组索引而不是哈希键?
    • @MSalters:总的来说,我同意你的看法。但是在 Unix 世界中,有一条非常普遍的规则,即内核对象句柄总是通过使用最小的空闲索引来分配的。这就是 stdin、stdout 和 stderr fd 分别为 0,1 和 2 的原因。这尤其适用于文件描述符,而且正如“make”所说,这条规则似乎也适用于线程。 Unix 开发人员(我也是)习惯于利用此功能,但移植当然更困难。
    • 我熟悉 Unix 的行为。但这与 printing 正确值的问题无关,是吗?这就是问题所在。如果你在线程 508 上,你显然应该打印 508。找到打印 2 的方法当然是可行的,但毫无意义。
    【解决方案2】:

    您的意思是 Windows 中的当前线程句柄?

    GetCurrentThread()

    【讨论】:

    • 感谢您的回复。使用 GetCurrentThread() 时出现错误:错误 C3861: 'GetCurrentThread': identifier not found 是否有要包含的库?再次感谢
    • 谢谢!它不是从 2 作为 unix-variant 上的 pthread-self 开始的。还有别的吗?再次感谢
    • 参见 Giuseppe Guerrini 的评论:这不会返回真正的句柄;事实上,这很可能会为所有线程返回相同的值(操作系统实现细节)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多