scoped_thread包装类线程无输出及在ideone.com运行代码的问题
嘿,这就帮你拆解这两个C++线程相关的问题:
问题1:运行在scoped_thread包装类中的线程无输出的原因
可能的原因有这么几个,你可以逐一排查:
- 线程任务本身没写输出逻辑:先确认传给scoped_thread的线程函数里,是不是真的有
std::cout这类输出代码——要是任务本身就没打算输出,那自然看不到结果啦。 - 输出缓冲没刷新:C++的
cout默认是行缓冲模式,如果线程里的输出只写了std::cout << "xxx";,没加std::endl或者手动调用std::cout.flush();,缓冲里的内容可能没被刷到控制台,看起来就像没输出。改成带endl的写法试试,它会自动刷新缓冲。 - 线程执行中抛出未捕获异常:如果线程函数里触发了异常但没处理,线程会直接终止,可能还没走到输出那一步。可以在线程函数里套个
try-catch块,或者在main函数里捕获scoped_thread可能传递的异常(不过你的scoped_thread构造只检查了joinable,线程内部的异常得自己处理)。 - scoped_thread对象提前被销毁?:虽然scoped_thread的析构会调用
join()等待线程完成,但如果scoped_thread是在某个局部作用域里创建,作用域提前结束的话,析构会触发join,但只要线程还在跑,join会等它完成。不过还是要确认scoped_thread的生命周期是不是覆盖了线程执行的全程。
问题2:在ideone.com上运行这段C++代码的步骤
你提供的代码目前是不完整的(结尾有...),得先补全才能运行,具体步骤如下:
- 打开ideone后,把完整的代码粘贴到编辑区,比如补充一个测试用的
main函数和线程任务:#include <iostream> #include <thread> #include <utility> #include <stdexcept> class scoped_thread { private: std::thread t; public: explicit scoped_thread( std::thread t ) : t( std::move( t ) ) { if ( not this->t.joinable() ) { throw std::logic_error( "No thread" ); } } ~scoped_thread() { t.join(); } scoped_thread( const scoped_thread & ) = delete; scoped_thread & operator =( const scoped_thread & ) = delete; }; void thread_task() { std::cout << "Hello from wrapped thread!" << std::endl; } int main() { try { scoped_thread st(std::thread(thread_task)); } catch(const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } - 在页面顶部的语言选择栏里,选C++(ideone默认支持C++11及以上标准,刚好适配
std::thread和移动语义的用法)。 - 点击页面上的Run按钮,等待编译执行完成,就能在下方的输出区看到结果了。
内容的提问来源于stack exchange,提问作者Vlad from Moscow
相关产品推荐
相关产品推荐

