Конструктор std::thread
автоматически запускает поток немедленно , и новый поток затем вызывает предоставленную функцию, поэтому
std::thread x(&Page::play,this);
автоматически вызывает this->play()
в новом потоке.
Это отличается от некоторых библиотек потоков (таких как .Net), где вы должны явно запустить поток с помощью вызова функции-члена Start()
.Не существует средства «отложенного запуска» с std::thread
.
Если вы не хотите, чтобы ваш поток действительно запускался, пока вы не вызовете какую-либо другую функцию, не инициализируйте объект std::thread
в своем конструкторе,вместо этого сделайте это в вашей функции start()
, как вы показали.
Если вы вызовете join()
для объекта потока, тогда ваш код будет ожидать завершения потока при вызове join()
.Следовательно, если вы поместите соединение сразу после создания объекта потока, как в примере с start()
, то вы можете просто вызвать play()
напрямую, так как start()
не вернется, пока поток не завершится.
Вам не нужно std::bind
с std::thread
--- конструктор потока обрабатывает привязку автоматически.