根据C++ 参考的定义:
阻塞当前线程,直到由 标识的线程
*this
完成其执行。
那么这是否意味着在使用时,该线程.join()
不需要mutex.lock()
调用某个函数?我是互斥和线程的新手,所以我有点困惑。
注意:我找到了一本书 C++ Concurrency in Action,我正在阅读这本书。对于像我这样的多线程初学者来说,它写得非常好。
谢谢大家的帮助。
根据C++ 参考的定义:
阻塞当前线程,直到由 标识的线程
*this
完成其执行。
那么这是否意味着在使用时,该线程.join()
不需要mutex.lock()
调用某个函数?我是互斥和线程的新手,所以我有点困惑。
注意:我找到了一本书 C++ Concurrency in Action,我正在阅读这本书。对于像我这样的多线程初学者来说,它写得非常好。
谢谢大家的帮助。
您仍然需要互斥锁和条件。加入一个线程使一个执行线程等待另一个线程完成运行。您仍然需要互斥锁来保护共享资源。它允许本例中的 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 是共享资源访问和使用它也应该受到互斥保护。
join() 停止当前线程,直到另一个线程完成。互斥锁停止当前线程,直到互斥锁所有者释放它或如果它没有被锁定则立即锁定。所以这些人是完全不同的
它阻塞当前线程,直到调用 join() 的线程执行完成。
如果您没有在线程上指定 join() 或 dettach() ,则会导致运行时错误,因为主/当前线程将完成其执行,而创建的其他线程仍将运行。
std::thread.join 具有三个我可以想到的功能和其他一些功能:
a) 鼓励持续创建/终止/销毁线程,从而提高性能并增加应用程序发生泄漏、线程失控、内存失控和一般失控的可能性。
b) 通过强制执行不必要的等待来填充 GUI 事件处理程序,从而导致您的客户讨厌的无响应的“沙漏应用程序”。
c) 导致应用程序无法关闭,因为它们正在等待一个无响应、不间断的线程终止。
d) 其他坏事。
我了解您是多线程的新手,祝您一切顺利。另外,考虑到我今晚有很多 Adnams Broadside,但是:
Join() 和其他语言的朋友,如 TThread.WaitFor,(Delphi),是高效的多线程,就像 Windows ME 是操作系统。
请努力进步并理解其他多线程概念——池、任务、应用程序生命周期线程、通过生产者-消费者队列的线程间通信。事实上,几乎除了 Join() 之外的任何东西。