我提出了一个“极简主义的例子”,试图理解如何在C ++ 11中进行多线程。所以给出这个例子:
std::thread t[total_threads];
for(int i = 0; i<total_threads; i++){
t[i]= std::thread(&thread_function_1, random1, parameters1);
t[i].join();
t[i]= std::thread(&thread_function_2, random2, parameters2);
t[i].join();
t[i]= std::thread(&thread_function_2, random3, parameters3);
t[i].join();
}
显然,如果我尝试调试此代码,我将有堕胎错误。因为不可能两次使用相同的线程(我猜)。一种可能的解决方案是创建一个包含“数百万”线程的数组,以实现它(并在它们之间进行迭代)。但我想这是一个糟糕的解决方案。我怎样才能有效地做到这一点,因为我不能两次使用同一个线程?
答案 0 :(得分:1)
join()
表示阻止程序执行,直到指定的线程返回为止。因此,你最多需要做更多这样的事情。
// Spawn threads
std::thread t[total_threads];
for(int i = 0; i<total_threads; i++){
t[i]= std::thread(&thread_function[i], random[i], parameters[i]);
}
// Wait for threads, which are running concurrently, to finish
for(int i = 0; i<total_threads; i++){
t[i].join();
}
也就是说,多线程有很多工作要做,包括了解产生访问数据的各种线程如何确保它们都不会触及相同的数据。如果这些线程中的每个线程调用不同的函数,那么您的程序很可能不适合多线程。通常,当您同时产生一定数量的线程时,您试图在线程之间分解数据集的处理,每个线程都必须以类似的方式处理(即相同的功能)
答案 1 :(得分:-1)
如果您尝试调试此代码,则应该没有中止错误,除非您因thread_function_1
等人所做的事而得到一些错误。
加入后重新使用线程对象是安全的。
要实现真正的多线程,你需要启动多个线程并让它们运行,只有在完成时才加入,为此你需要使用一些同步,比如条件变量。