Ответ 1
Портативность
std::thread
является новичком в стандарте С++ 11 - с ним вы можете написать переносимый код на С++ для компиляторов, поддерживающих С++ 11. Вы можете почувствовать future
в нем.
Он основан на boost::thread
, который поддерживает более старые компиляторы, не поддерживающие С++ 11, что упрощает перенос на другие платформы.
Если вам нужно использовать специальные трюки платформы, std::thread::native_handle
- это путь.
CreateThread
специфичен для WinAPI, это подразумевает запись непереносимого кода. Кроме того, этот API довольно старый и более неудобный для использования.
RAII
WinAPI - это API C, который не поощряет современный С++ хороший практика. Каждый создающий примитив, вы должны впоследствии уничтожить вручную.
Это не относится к библиотеке потоков в С++ 11, что упрощает запись абстракций более высокого уровня. Пока std::thread
все еще довольно низкоуровневый (либо ваш .join()
, либо .detach()
ваш поток, либо деструктор потока завершит вашу программу), библиотека потоков С++ 11 имеет std::lock_guard
и другие классы блокировки для поддержки RAII для мьютексов.
В то время как С++ 11 имеет некоторые абстракции более высокого уровня, такие как std::async
для запуска функций асинхронно, он не предоставляет других абстракций, таких как threadpool, поэтому вы можете использовать другие библиотеки.
Тип безопасности
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. Нет смысла использовать потоки WinAPI в качестве основного механизма потоков в новом коде на С++.