Что такое join() в Boost::thread? (С++)

на Java я бы сделал что-то вроде:

Thread t = new MyThread();
t.start();

я запускаю поток, вызывая метод start (). Поэтому позже я могу сделать что-то вроде:

for (int i = 0; i < limit; ++i)
{
    Thread t = new MyThread();
    t.start();
}

создать группу потоков и выполнить код в метод run ().

однако в C++ нет такой вещи, как метод start (). Используя Boost, если я хочу, чтобы поток начал работать, я должен вызвать метод join() для запуска потока.

#include <iostream>
#include <boost/thread.hpp>

class Worker
{
public:
    Worker() 
    {
        // the thread is not-a-thread until we call start()
    }

    void start(int N)
    {
        m_Thread = boost::thread(&Worker::processQueue, this, N);
    }

    void join()
    {
        m_Thread.join();
    }

    void processQueue(unsigned N)
    {
        float ms = N * 1e3;
        boost::posix_time::milliseconds workTime(ms);

        std::cout << "Worker: started, will work for "
                  << ms << "ms"
                  << std::endl;

        // We're busy, honest!
        boost::this_thread::sleep(workTime);
        std::cout << "Worker: completed" << std::endl;
    }

private:

    boost::thread m_Thread;
};

int main(int argc, char* argv[])
{
    std::cout << "main: startup" << std::endl;

    Worker worker, w2, w3, w5;

    worker.start(3);
    w2.start(3);
    w3.start(3);
    w5.start(3);

    worker.join();
    w2.join();
    w3.join();
    w5.join();
    for (int i = 0; i < 100; ++i)
    {
        Worker w;
        w.start(3);
        w.join();
    }
    //std::cout << "main: waiting for thread" << std::endl;    

    std::cout << "main: done" << std::endl;

    return 0;
}

на коде выше, цикл for чтобы создать 100 потоков, обычно я должен использовать boost:: thread_group для добавления функции thread и, наконец, запустить все с join_all(). Однако я не знаю, как это сделать с помощью функции thread, помещающей класс, который использует различные члены класса.

С другой стороны, цикл выше не будет вести себя как цикл в Java. Он заставит каждый поток выполняться последовательно, а не все сразу, как другие разделенные потоки, чье собственное join() вызывается.

что такое join() в Boost точно? Также, Пожалуйста, помогите мне создать группу потоков, которые разделяют один и тот же класс.

2 ответов


join не запускает поток, он блокирует вас, пока поток, к которому вы присоединяетесь, не завершится. Вы используете его, когда вам нужно дождаться потока, который вы начали, чтобы закончить его запуск (например, если он что-то вычисляет, и вам нужен результат).

что запускает поток boost::thread, который создает поток и вызывает функцию потока, которую вы передали ему (в вашем случае -Worker::processQueue).

причина, по которой у вас возникли проблемы с циклом, не в том, что потоки не запускались, но потому, что ваш основной поток не ждал их выполнения перед завершением. Я предполагаю, что вы не видели эту проблему в Java из-за различий в расписании, он же "неопределенное поведение". после редактирования в Java многопоточность ведет себя немного по-другому, см. комментарий ниже. Это объясняет, почему вы не видели его в Java.

вопрос о boost::thread_group. Читать код в вопрос и ответы помогут вам.


присоединение к потоку делает то же самое в Boost, что и в Java: он ждет завершения работы потока.

плюс, если я правильно помню, потоки Boost работают при строительстве. Вы не начинаете их явно.