Windows Threading-C++

Windows Threading-C++

本文关键字:Threading-C++ Windows      更新时间:2023-10-16

我正在寻找一个API在windows上,使创建和杀死线程的意愿。还具有将线程绑定到内核的能力。我被介绍到Win32线程API在这里。然而,当我检查MSDN时,我看到_beginthreadx()和_endthreadx()。所以我猜应该有一个调用_endthreadx每次我创建一个线程?
为了得到这些问题的答案,我正在寻找一个关于Windows线程的教程。有人能帮忙吗?

注:这可能离题了,但是Boost也支持线程亲和性吗?如果是这样,谁能给我一个教程/文档相关的线程亲和性?

创建线程(例如_beginthreadex)后,您需要让线程优雅地退出,因为您永远不知道它现在是否处于某些事情的中间(例如,对某个资源具有锁)。你仍然可以选择在任何时候用TerminateThread API把它吹走。

SetThreadAffinityMask和朋友让你在CPU战场上定位你的线程。你可能最终会让操作系统调度器选择内核来运行你的线程,因为它很有可能会更有效率。

关于重用线程的更新:创建一个线程,你正在传递你的线程进程来启动,一旦你从它返回,线程即将被终止。也就是说,启动另一个工作线程活动可能有两种方式:要么从开始创建一个新线程,要么不退出线程进程并同步以赶上新的工作线程活动请求。后者可以使用IPC对象实现,例如事件:

int ThreadProc()
{
  while(true)
  {
    wait for new event;
    if(termination requested) break;
    otherwise, on worker activity request, do next requested task;
  }
}

参考线程同步初学者的示例代码和描述

如果你正在使用MFC,你可以更好地使用CWinThread。您可以很容易地向线程发送消息,并且可以从外部控制线程的行为。使用线程句柄,您可以使用SetThreadAffinityMask为线程提供一个亲和掩码,它将在所需的处理器上调度线程。

1)不要混淆_beginthread/_beginthreadx和Win32 API函数CreateThread。这是两个不同的api。详情请参阅其他SO帖子。

2)如果你使用_beginthread/_beginthreadx, _endthread/_endthreadx应该用于终止

3) TerminateThread(以及_endthread)在正常情况下不应该使用。见MSDN Post.

SetThreadAffinityMask或setthreadadidealprocessor等函数可以用来设置线程应该使用的内核。

5) boost线程API更加健壮和简单。实际上它是c++ 11线程的基础