哪个选项更适合在Visual C ++下创build(和pipe理)线程:C ++ 11 std::thread
或者WinAPI
函数(比如CreateThread
, _beginthreadex
等),为什么?
std::thread
对于C ++ 11来说是新的标准 – 通过它,你可以在支持C ++ 11的编译器中用C ++编写可移植的代码。 你可以感受到future
。
它基于boost::thread
,它支持不支持C ++ 11的较老的编译器,这使得移植到其他平台更容易。
如果你需要使用平台特定的技巧, std::thread::native_handle
是要走的路。
CreateThread
特定于WinAPI,这意味着编写不可移植的代码。 而且,这个API很旧,使用起来也不方便。
WinAPI是一个不鼓励现代C ++ 良好 实践的C API。 你创建的每一个线程原语,你都必须手动销毁。
C ++ 11中的线程库并非如此,这使得更高级的抽象更易于编写。 虽然std::thread
还是相当低级的(无论是你的.join()
还是.detach()
你的线程,或者线程的析构函数都会终止你的程序),C ++ 11线程库有std::lock_guard
和其他的锁支持RAII的互斥类。
虽然C ++ 11具有一些更高级的抽象,比如std::async
启动函数,但是它不提供像线程池(threadpools)这样的其他抽象,因此您可能需要使用其他库。
WinAPI只能调用具有特定签名的函数指针 – 容易出现与类型安全,对象生命周期和内存管理不当有关的错误。
std::thread
可以调用任何可调用的对象:
// call free-standing function in a separate thread std::thread first(func); // call free-standing function with arguments (1, 2), in a separate thread std::thread second(func, 1, 2); // call static member function in a separate thread std::thread third(&A::static_memfun); // call non-static member of a temporary in a separate thread std::thread fourth(&A::memfun, A()); //call std::function in a separate thread std::function<void(int)> callback = std::bind(func, 1, _1); std::thread fifth(callback, 2); // call a function object Functor f; std::thread sixth(f);
TL; DR :没有理由在新的C ++代码中使用WinAPI线程作为主线程机制。
跨平台性是一个小好处。 真正的好处是在界面上。 std::thread
提供RAII-保证std::thread
的清理,并且支持任意的函数对象参数,而不仅仅是函数指针。 std::thread
是CreateThreadEX上的C ++ 11封装,这是有原因的。
正如一个侧面说明,std :: thread是一个可怕的,可怕的API。 如果你自己创建线程,你可能做错了。 使用真正的线程API,如英特尔的TBB或微软的PPL,这是远远优于可怕的 std::thread
和某种方式更糟糕的 CreateThreadEx。 std::thread
就像是:“嘿,伙计们,我提供了跨平台的mmap
,所以你可以自己写malloc
,享受!”
你应该使用std :: thread。
std :: thread是(new)标准的一部分,并且是可移植的。
除非你只是针对Windows,而你需要使用WinAPI与你的线程进行交互,否则std :: thread就是要走的路。