C++ std::thread.join()做什么?

C++ std::thread.join()做什么?,c++,multithreading,mutex,C++,Multithreading,Mutex,作者: 阻止当前线程,直到由*this标识的线程完成其执行 那么这是否意味着当使用.join()时,当线程调用某个函数时,就不需要互斥锁.lock()?我不熟悉互斥和线程,所以我有点困惑 注意:我找到一本书 C++并发操作,我正在读这本书。对于像我这样的多线程初学者来说,这本书写得非常好 谢谢大家的帮助。join()停止当前线程,直到另一个线程完成。互斥体停止当前线程,直到互斥体所有者释放它或者如果它没有被锁定就立即锁定。因此,这些家伙完全不同您仍然需要互斥体和条件。加入一个线程会使一个执行线程

作者:

阻止当前线程,直到由
*this
标识的线程完成其执行

那么这是否意味着当使用
.join()
时,当线程调用某个函数时,就不需要
互斥锁.lock()
?我不熟悉互斥和线程,所以我有点困惑

注意:我找到一本书 C++并发操作,我正在读这本书。对于像我这样的多线程初学者来说,这本书写得非常好


谢谢大家的帮助。

join()停止当前线程,直到另一个线程完成。互斥体停止当前线程,直到互斥体所有者释放它或者如果它没有被锁定就立即锁定。因此,这些家伙完全不同

您仍然需要互斥体和条件。加入一个线程会使一个执行线程等待另一个线程完成运行。您仍然需要互斥来保护共享资源。在本例中,它允许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;
}

由于std::cout是一种共享资源访问,它的使用也应该受到互斥保护。

std::thread.join有三个功能,我可以马上想到,还有一些其他功能:

a) 鼓励持续创建/终止/销毁线程,从而影响性能,增加应用程序泄漏、线程失控、内存失控和失控的可能性

b) 通过强制执行不必要的等待来填充GUI事件处理程序,从而导致客户讨厌的无响应“沙漏应用”

c) 导致应用程序无法关闭,因为它们正在等待一个非主动、不可中断线程的终止

d) 其他不好的事情

我知道你是多线程新手,我希望你在这方面做得最好。另外,考虑到今晚我有很多广告,但是:

Join()和它在其他语言中的朋友,如TThread.WaitFor(Delphi),都是高效的多线程,就像Windows ME在操作系统中一样


请努力学习并理解其他多线程概念-池、任务、应用生命周期线程、通过生产者-消费者队列的线程间通信。事实上,除了Join()之外,几乎任何东西都会阻塞当前线程,直到调用Join()的线程的执行完成


如果未在线程上指定join()或dettach(),则会导致运行时错误,因为主/当前线程将完成其执行,而创建的另一个线程仍将运行。

不过,我更喜欢“挂起”而不是“停止”。感谢David的编辑,以使其更加清晰。马丁:我试着用谷歌搜索,但我看到4-5个样本都有相同的想法,从我的角度看,并没有真正显示join在做什么。我认为这里的ppl很有知识,并且会提供最好的代码样本。谢谢Joel,所以这里是ten_thread。join()会告诉程序ten_thread已经完成,可以转到下一步吗?运行main()的执行线程将在调用ten_thread.join()时阻塞,直到ten_thread返回。一旦ten_线程执行结束,main的执行就可以继续。希望这能有所帮助。
更新了fr[U]o[p]m[d][at]te[e]n[d][t[f]h[r]r[o]e[m]a[]d[five_thread]
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.