通过从C ++参考定义 :
阻止当前线程,直到被标识的线程
*this
完成它的执行。
那么,这是否使用时的意思.join()
有没有必要mutex.lock()
当线程调用一些功能? 我是新来的相互排斥和线程,所以我有点困惑。
注:我发现了一本书C ++并发在行动,我读的书。 它写的很好的多线程上像我这样的初学者。
谢谢大家的帮助。
通过从C ++参考定义 :
阻止当前线程,直到被标识的线程
*this
完成它的执行。
那么,这是否使用时的意思.join()
有没有必要mutex.lock()
当线程调用一些功能? 我是新来的相互排斥和线程,所以我有点困惑。
注:我发现了一本书C ++并发在行动,我读的书。 它写的很好的多线程上像我这样的初学者。
谢谢大家的帮助。
你仍然需要互斥和条件。 加入一个线程进行执行一个线程等待另一个线程完成运行。 你仍然需要互斥来保护共享资源。 它允许的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()方法或dettach()的线程上,然后它会导致运行时错误作为主/当前线程将完成它的执行,并创建将仍然运行的其他线程。
的std ::的Thread.join有三个功能,我能想到的副手和其他一些:
一)鼓励不断创建/终端/销毁线程的,所以锤击性能并增加了泄漏的probabilty,线程失控,内存失控和一般丧失控制您的应用程序。
B)的东西GUI事件处理程序通过执行不必要的等待,导致反应迟钝“沙漏应用”,你的客户会恨。
C)会使应用程序,因为他们在等待一个unresposive,不间断线程终止失败关机。
d)其他坏事。
据我所知,你是新的多线程,我想你最好吧。 另外,考虑到我已经有很多Adnams宽边今晚,但是:
加入(),它的像TThread.WaitFor其他语言的朋友,(德尔福),是高效的多线程像Windows ME是操作系统。
请努力尝试进步,来了解其他多线程的概念 - 通过生产者 - 消费者队列池,任务,应用千载难逢的线程,线程间通讯科。 事实上,除了加入几乎所有的东西()。