我正在寻找一个在windows上的API,使能够创建和杀死线程的意愿。还具有将线程绑定到内核的能力。我被介绍了Win32线程应用编程接口here。
然而,当我检查MSDN时,我看到了_beginthreadex()和_endthreadex()。所以我猜每次我创建线程时都会调用_endthreadex?
为了得到这些问题的答案,我正在寻找一本关于Windows线程的教程。有人能帮上忙吗?
附言:这可能是离题的,但是Boost也支持线程亲和力吗?如果是这样的话,有人能给我推荐一个与线程亲和性相关的教程/文档吗?
发布于 2011-10-21 16:31:28
创建线程后(例如使用_beginthreadex),您需要让线程优雅地退出,因为您永远不会知道它是否正处于某个过程中(例如,在某个资源上有一个锁)。你仍然可以选择在任何时候用TerminateThread应用编程接口来消除它。
SetThreadAffinityMask和朋友可以让你在中央处理器战场上定位你的线程。不过,您可能最终会离开OS调度程序来选择运行线程的核心,因为它很可能会更高效。
关于重用线程的更新:创建线程时,您正在传递线程proc以启动,一旦您从线程中返回,该线程将被终止。也就是说,可以通过两种方式启动另一个工作线程活动:要么从头创建一个新线程,要么不退出线程进程并进行同步,以赶上新的工作线程活动请求。后者可以使用IPC对象实现,例如事件:
int ThreadProc()
{
while(true)
{
wait for new event;
if(termination requested) break;
otherwise, on worker activity request, do next requested task;
}
}有关示例代码和说明,请参阅Thread Synchronization for Beginners。
发布于 2011-10-21 17:19:24
如果你使用的是MFC,你最好使用CWinThread。您可以很容易地向线程发送消息,并且可以从外部控制线程的行为。通过线程句柄,您可以使用SetThreadAffinityMask为线程提供亲和性掩码,这将在所需的处理器上调度线程。
发布于 2011-10-21 18:31:44
1)请不要将_beginthread/_beginthreadex和Win32接口函数CreateThread混淆。这是两个不同的API。详情请参见Other SO Post。
2)如果使用_beginthread/_ _endthread/_endthreadex,则需要使用_endthread/_endthreadex进行销毁
3)正常情况下不应使用TerminateThread (以及_endthread)。参见MSDN Post。
4)可以使用SetThreadAffinityMask或SetThreadIdealProcessor等函数来设置线程应该使用的内核。
5) boost threading应用编程接口更加健壮和简单。实际上它是C++11线程的基础。
https://stackoverflow.com/questions/7846796
复制相似问题