【发布时间】:2018-02-14 04:14:20
【问题描述】:
我一直在学习更多关于多线程和锁定的知识,这让我想到了http://www.cplusplus.com/reference/thread/thread/join/提供的基本示例
该页面提供的基本解释是:
线程执行完成后函数返回。
好的,听起来好像我们启动了一个线程,当我们启动的线程完成时,我们将恢复调用线程。
这是来自网站的一些示例代码,我已添加了一个打印语句。
#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;
}
根据我看到的 join 描述,我希望输出是:
**************************************************** ***
在线程连接之间
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$
我的逻辑是:
-
主线程调用 th1.join,因此主线程暂停执行直到 th1.join 完成。
-
打印出星星后th1执行完成,然后我的打印语句执行
-
第 2 次执行开始和结束
实际上并非如此,th2 可以在 th1 之前执行,我的 print 语句通常是最后出来的。 join 实际上对主线程做了什么?它似乎并没有像我一直在线阅读那样真正阻止它。
无论如何,我的解释毫无意义,因为它似乎与单线程进程相同。救命!
TLDR;
调用 join 时会发生什么?新线程开始了,但是主线程会发生什么?如果主线程确实阻塞了,为什么我的例子不是这样?
谢谢
编辑:
我想我明白了。出于某种原因,我认为 th1 在调用 join 时开始执行。 th1 在构造函数被调用时开始执行。 Join 将阻塞主线程,直到 th1 开始执行后完成。谢谢大家!
【问题讨论】:
-
join() 发生的事情正是所描述的。但是请注意,您阅读的join()的描述中没有任何内容可以保证您在连接之前的任何特定执行顺序,当多个执行线程正在运行并且您正在加入其中之一时。事实上,第二个线程可以启动,并设法在第一个线程之前获取互斥锁,从而首先运行。没有任何保证。显示的示例实际上是垃圾。 -
th1&th2正在同时运行。当th1完成并加入时,th2也已完成,等待您的加入。 -
我不明白你为什么期望
th1.join();以某种方式阻止/阻止th2的执行。您在调用th1.join();之前启动了th2。为什么你期望th2以某种方式“等待”并且只在很久以后才开始? -
嗨@AnT,请看我的新编辑。出于某种原因,我认为 join 也开始执行线程。当您调用构造函数时,执行开始。我的错。
标签: c++ multithreading mutex