Подтвердить что ты не робот

Что делает std:: thread.join()?

По определение из справки С++:

Блокирует текущий поток, пока поток, идентифицированный *this, не завершит его выполнение.

Значит ли это, что при использовании .join() нет необходимости mutex.lock(), когда этот поток вызывает некоторую функцию? Я новичок в взаимном исключении и потоке, поэтому я немного смущен.

Примечание: я нашел книгу С++ Concurrency в действии, и я читаю книгу. Это очень хорошо написано для новичка по многопоточности, как я.

Спасибо всем за помощь.

4b9b3361

Ответ 1

Вам все еще нужны мьютексы и условия. Присоединение потока делает один поток выполнения ожидающим завершения другого потока. Для защиты общих ресурсов вам по-прежнему нужны мьютексы. Он позволяет main() в этом примере дождаться завершения всех потоков до выхода из него.

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>

using namespace std;



int global_counter = 0;
std::mutex counter_mutex;

void five_thread_fn(){
    for(int i = 0; i<5; i++){
        counter_mutex.lock();
        global_counter++;
        counter_mutex.unlock();
        std::cout << "Updated from five_thread"  << endl;
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
    //When this thread finishes we wait for it to join
}

void ten_thread_fn(){
    for(int i = 0; i<10; i++){
        counter_mutex.lock();
        global_counter++;
        counter_mutex.unlock();
        std::cout << "Updated from ten_thread"  << endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    //When this thread finishes we wait for it to join
}
int main(int argc, char *argv[]) {
    std::cout << "starting thread ten..." << std::endl;
    std::thread ten_thread(ten_thread_fn);

    std::cout << "Running ten thread" << endl;
    std::thread five_thread(five_thread_fn);


    ten_thread.join();
    std::cout << "Ten Thread is done." << std::endl;
    five_thread.join();
    std::cout << "Five Thread is done." << std::endl;
}

Обратите внимание, что вывод может выглядеть так:

starting thread ten...
Running ten thread
Updated frUopmd atteend_ tfhrroema df
ive_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from five_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from five_thread
Ten Thread is done.
Updated from five_thread
Updated from five_thread
Five Thread is done.

Так как std:: cout является общим доступом к ресурсам, и его использование также должно быть защищено также и mutex.

Ответ 2

join() останавливает текущую нить, пока не закончится другая. mutex останавливает текущий поток до тех пор, пока владелец mutex не выпустит его или не заблокирует сразу, если он не заблокирован. Итак, эти ребята совсем другие

Ответ 3

Он блокирует текущий поток до тех пор, пока не будет выполнено выполнение потока, на который вызывается функция join().

Если вы не укажете join() или dettach() в потоке, это приведет к ошибке выполнения, поскольку основной/текущий поток завершит выполнение, а другой созданный поток будет продолжать работать.

Ответ 4

std:: thread.join имеет три функции, которые я могу представить из рук и других:

a) Поощряет непрерывное создание/завершение/уничтожение потоков, что приводит к удару производительности и увеличению вероятности утечек, потокобезопасности, утечки памяти и общей потери управления вашим приложением.

b) Слушатели событий GUI объектов, принудительно применяя нежелательные ожидания, приводя к невосприимчивым "песочным часам", которые будут ненавидеть ваши клиенты.

c) Заставляет приложения выходить из строя, потому что они ждут завершения невосстановимого, непрерывного потока.

d) Другие плохие вещи.

Я понимаю, что вы новичок в многопоточности, и я желаю вам всего наилучшего. Также подумайте, что сегодня у меня было много Adnams Broadside, но:

Join(), и его друзья на других языках, таких как TThread.WaitFor, (Delphi), предназначены для эффективного многопоточности, как Windows ME, для операционных систем.

Постарайтесь проработать и понять другие многопоточные понятия - пулы, задачи, потоки приложений и жизненных циклов, межпоточные коммуникации через очереди производителей-потребителей. Фактически, почти все, кроме Join().