通过definition from C++ reference:
阻塞当前线程,直到由*this
标识的线程完成其执行。
那么这是否意味着当使用.join()
时,当线程调用某个函数时就不需要mutex.lock()
了呢?我是互斥和线程的新手,所以我有点困惑。
注意:我找到了一本书C++ Concurrency in Action,我正在阅读这本书。对于像我这样的多线程初学者来说,它写得非常好。
通过definition from C++ reference:
阻塞当前线程,直到由*this
标识的线程完成其执行。
那么这是否意味着当使用.join()
时,当线程调用某个函数时就不需要mutex.lock()
了呢?我是互斥和线程的新手,所以我有点困惑。
注意:我找到了一本书C++ Concurrency in Action,我正在阅读这本书。对于像我这样的多线程初学者来说,它写得非常好。
4条答案
按热度按时间2vuwiymt1#
您仍然需要互斥锁和条件。联接线程使一个执行线程等待另一个线程完成运行。您仍然需要互斥锁来保护共享资源。在这个例子中,它允许main()在退出之前等待所有线程完成。
请注意,输出可能如下所示:
由于std::cout是一个共享资源访问,因此它的使用也应该受到互斥保护。
68de4m5k2#
join()停止当前线程,直到另一个线程完成。mutex会停止当前线程,直到mutex所有者释放它,或者如果它没有被锁定,则立即锁定。所以这些家伙很不一样
zdwk9cvp3#
它阻塞当前线程,直到调用join()的线程执行完毕。
如果你没有在线程上指定join()或dettach(),那么它将导致运行时错误,因为主/当前线程将完成其执行,而创建的其他线程仍将运行。
axr492tv4#
std::thread.join有三个我能想到的函数和其他一些函数:
a)鼓励持续创建/终止/销毁线程,因此会影响性能并增加泄漏,线程失控,内存失控和应用程序的一般失控的可能性。
B)通过强制执行不必要的等待来填充GUI事件处理程序,导致客户讨厌的无响应的“沙漏应用程序”。
c)导致应用程序无法关闭,因为它们正在等待一个不可响应的不可中断线程的终止。
(三)其他不好的事情。
我知道您是多线程的新手,祝您一切顺利。另外,考虑到我今晚有很多Adnams Broadside,但是:
Join()和它在其他语言中的朋友,如TThread.WaitFor( Delphi ),是高效的多线程,就像Windows ME是操作系统一样。
请努力学习并理解其他多线程概念-池、任务、应用生命周期线程、通过生产者-消费者队列的线程间通信。事实上,除了Join()之外,几乎什么都有。