多任务处理是不是在我的计划中工作的C++ 11
如何启动并联一个新的线程不停顿的主要功能?多任务处理是不是在我的计划中工作的C++ 11
这里是我的代码:
void someFunction { while(1);}
int main(){
thead *th = new thead(&someFunction);
thead.join();
return 0;
}
但程序不停止
附:如何在并行源中运行线程
这一呼吁:
thread.join();
明确地告诉你的程序要等到thread
执行时,返回的功能。你的函数永远不会返回,所以你的程序永远不会通过这个函数调用。您可以在创建线程和join()
相应调用之间启动额外的线程。例如:
#include <thread>
void someFunction() { for(volatile int x = 0; ; x = x){};}
int main()
{
std::thread t1(someFunction);
std::thread t2(someFunction);
std::thread t3(someFunction);
t1.join();
t2.join();
t3.join();
return 0;
}
会产生3个完全没有任何作用的线程。如果传递给线程的函数返回,这就是你想要做的。
如果你想有之前的任务运行和主程序退出,则需要产生新的进程在依赖于平台的方式,让自己的执行不会受到你的程序退出停止。
程序无法停止,因为主线程调用thread.join()
这意味着它将等待线程“线程”完成,但是那个调用的函数永远不会完成,因为它会循环到无穷远。
你thread.join();
正在等待辅助线程退出,但由于二级线程执行一个无限循环,它永远不会退出。
编辑:我应该补充的是,标准给予足够的余地允许线程退出,但它不是必需的。
好的,thx。什么在并行流中运行线程? – 2012-01-18 18:23:57
创建线程对象('new thread(someFunction);')创建运行您指定的函数的新线程。 – 2012-01-18 18:29:54
你加入到一段时间(1)循环。当(1)结束时,程序将停止,即。决不。
或立即。这是C++ 11,“一个循环......可以由实现终止。” – 2012-01-18 18:31:29
@DavidSchwartz - 大概是这样的,连接会导致引用循环,导致编译器无法优化它? – 2012-01-18 19:21:30
不太可能。没有理由与其他人有任何关系。如果代码终止,那要么是因为编译器没有足够的智能来优化循环,要么是足够聪明的,以便计算非终止。 (如果我正在编写一个C++ 11编译器,我不会优化出一个显然不会终止的循环,因为这是令人吃惊的行为,只有在我无法确定循环终止时才使用规则,或者不,但可以告诉它没有其他影响。) – 2012-01-18 19:50:59
在C++ 11,实现如下permitted to assume that this kind of loop terminates。所以你的代码可以被优化到什么都没有。否则,很多合法和有价值的优化是不可能的,但偶尔会产生令人惊讶的效果。
'加入()'等待线程完成,并阻止您创建的线程后,它已经开始了。但是在退出或终止它之前,你应该在主线程中调用join()。 – PeterT 2012-01-18 18:22:24