C++ 正在寻找std::join行为的说明

C++ 正在寻找std::join行为的说明,c++,multithreading,mutex,C++,Multithreading,Mutex,我已经学习了更多关于多线程和锁定的知识,这使我获得了 该页提供的基本解释是: 当线程执行完成时,函数返回 好的,听起来好像我们启动了一个线程,我们将在启动的线程完成后继续调用线程 下面是来自该站点的一些示例代码,我在其中添加了一个print语句 #include <iostream> #include <thread> #include <mutex> #include <unistd.h> std::mutex mtx; void print

我已经学习了更多关于多线程和锁定的知识,这使我获得了

该页提供的基本解释是:

当线程执行完成时,函数返回

好的,听起来好像我们启动了一个线程,我们将在启动的线程完成后继续调用线程

下面是来自该站点的一些示例代码,我在其中添加了一个print语句

#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>

std::mutex mtx;

void print_block (int n, char c) {
    mtx.lock();
    for (int i = 0; i < n; i++)
    {
        std::cout << c;
    }
    std::cout << std::endl ;
    mtx.unlock();

    return;
}

int main()
{
    std::thread th1(print_block, 50, '*');
    std::thread th2(print_block, 60, '$');

    th1.join();
    //my print statement
    std::cout << "In between thread joins" << std::endl;
    th2.join();
    
    return 0;
}
#包括
#包括
#包括
#包括
std::互斥mtx;
无效打印块(整数n,字符c){
mtx.lock();
对于(int i=0;i
调用join时会发生什么?新线程开始了,但是
主线程会发生什么情况?如果主线程阻塞,为什么
我的例子不是这样吗

th1.join()
将阻止当前线程的执行(在本例中是运行函数
main()
的执行线程),直到由
th1
表示的执行线程完成并返回

现在,这与
th2
是否在
th1
之前完成无关(不能保证线程
th1
在线程
th2
之前进入函数并拾取锁)。该方法所说的是,“在
th1
完成之前不要继续”

因此,是的,
th2
可能在
th1
之前完成,但是

std::cout << "In between thread joins" << std::endl;
std::cout这个例子不好(原因如下)

调用join时会发生什么?新线程开始了,但是 主线程会发生什么情况?如果主线程阻塞,为什么 我的例子不是这样吗

th1.join()
将阻止当前线程的执行(在本例中是运行函数
main()
的执行线程),直到由
th1
表示的执行线程完成并返回

现在,这与
th2
是否在
th1
之前完成无关(不能保证线程
th1
在线程
th2
之前进入函数并拾取锁)。该方法所说的是,“在
th1
完成之前不要继续”

因此,是的,
th2
可能在
th1
之前完成,但是

std::cout << "In between thread joins" << std::endl;

std::cout由于一个完全不同的原因,所示示例实际上是垃圾。它显然假定第一个线程将在第二个线程之前成功锁定互斥。这显然不是真的。谢谢,我误解了新线程是在调用join时开始的。在这种情况下,它是在调用构造函数时开始的。谢谢所示的示例实际上是垃圾,原因完全不同。它显然假定第一个线程将在第二个线程之前成功锁定互斥锁。这显然不是真的。谢谢,我误解了新线程是在调用join时开始的。在这种情况下,它是在调用构造函数时开始的。谢谢h
join
()正是所描述的情况。但是,请注意,
join()的描述中没有任何内容
当多个执行线程正在运行且您正在加入其中一个线程时,您阅读的内容保证您在加入之前有任何特定的执行顺序。事实上,第二个线程可以在第一个线程之前启动并设法获取互斥体,从而首先运行。没有任何保证。所示示例为实际上,垃圾。
th1
th2
正在同时运行。当
th1
完成并加入时,机会是
th2
也完成了,正在等待你加入。我不明白你为什么期望
th1.join();
以某种方式阻止/阻止执行
th2
。您在调用
th1.join()之前启动了
th2
。为什么希望
th2
以某种方式“等待”然后再晚一点开始?嗨@AnT,请看我的新编辑。出于某种原因,我认为join也开始执行线程。执行从调用构造函数开始。我的错误。
join
()发生的事情正是描述发生的事情。但是,请注意,
join()的描述中没有任何内容
当多个执行线程正在运行且您正在加入其中一个线程时,您阅读的内容保证您在加入之前有任何特定的执行顺序。事实上,第二个线程可以在第一个线程之前启动并设法获取互斥体,从而首先运行。没有任何保证。所示示例为实际上,垃圾。
th1
th2
正在同时运行。当
th1
完成并加入时,机会是
th2
也完成了,正在等待你加入。我不明白你为什么期望
th1.join();
以某种方式阻止/阻止执行
th2
。您在调用
th1.join()之前启动了
th2
。为什么希望
th2
以某种方式“等待”只在很久以后才开始?嗨@AnT请看我的新编辑。出于某种原因,我认为join也开始执行线程。执行从调用构造函数开始。我的错误。