Инициализация std :: thread в ctor подвижного класса - PullRequest
0 голосов
/ 14 февраля 2012

Мне нужно инициализировать std :: thread в ctor класса.Поток должен запускать функцию-член самого класса.В ctor при попытке инициализации потока программа пытается запустить функцию-член.(Перемещение семантики реализовано).

Page::Page(Motion *_parent):
    parent(_parent)
{
    std::thread x(&Page::play,this);
    starter = std::move(x);
}

программа запускается play() из this!

РЕДАКТИРОВАТЬ : я делаю это:

void Page::start()
{
    std::thread x(&Page::play,this);
    x.join();
}

И работает нормально, но не знаю, нормально ли это или нет ... Теперь я играю с std::bind, если это стандартный способ, я заменю код.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Конструктор 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 --- конструктор потока обрабатывает привязку автоматически.

1 голос
/ 14 февраля 2012

Как насчет этого:

#include <iostream>
#include <thread>
#include <functional>

struct Foo
{
    Foo()
        : thread(std::bind(Foo::bar, this))        
        { }

    ~Foo() 
        { thread.join(); }

    static void bar(Foo *foo)
        { }

    std::thread thread;
};

int main()
{
    Foo foo;
}
...