我正在测试新的C ++ 11线程功能。为此,我通过为其构造函数提供lambda表达式来启动一个线程:
int main()
{
thread t([]() {
cout << "Hello World!" << endl;
});
//this_thread::sleep_for(chrono::seconds(5));
cout << "I am done!" << endl;
getchar();
return 0;
}
但是在我按下一个键(getchar
)后,我收到错误:
有人能说出理由吗?
答案 0 :(得分:4)
您期望看到的行为,以下内容解释了如何避免这种行为。
来自std::thread::~thread documentation。
如果* this有一个关联的线程(joinable()== true),则调用std :: terminate()。
在
之后,线程对象没有关联的线程(并且可以安全销毁)
- 是默认构造的
- 它已从
移出- join()被称为
- 分离()已被称为
那又怎样?我知道必须只调用join()让主线程等待工作线程。在这种情况下,没有等待的目的,因为我按了一个键。
为什么没有等待的目的?如果//Hook a callback into the rendered Google Search. From my understanding, this is possible because the outermost rendered div has id of "___gcse_0".
window.__gcse = {
callback: googleCSELoaded
};
function googleCSELoaded() {
// The hook in question.
$("#customSearch").click(function() {
var searchText = $("#customSearchText").val();
console.log(searchText);
var element = google.search.cse.element.getElement('searchOnlyCSE');
element.execute(searchText);
})
}
// CSE Code. This is a free version, so please don't make too many requests.
(function() {
var cx = '001386805071419863133:cb1vfab8b4y';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
函数在线程使用main
流对象之前完成执行会发生什么情况(尽管即使你有std::cout
调用它仍然不太可能)?该全局流对象是否仍然有效供线程使用?