void test() { ThreadRunner mThread("test"); int mCount = 1; mThread.start([&mCount] { mCount++; printf("thread run...%d\n", mCount); std::chrono::milliseconds sleepDuration(2000); std::this_thread::sleep_for(sleepDuration); return true; }); cout << "test end..\n" << endl; } int main() { test(); cout << "test out..\n" << endl; }
ThreadRunner created. name:test ThreadRunner created. name:test test end.. ThreadRunner started. name:test thread run...2 thread run...3 thread run...4 thread run...5 thread run...6 thread run...7 thread run...8 thread run...9 thread run...10 thread run...11 thread run...12 thread run...13 thread run...14 thread run...15 thread run...16
由于test()函数退出时会对ThreadRunner进行析构,而子线程循环运行,永远无法析构,导致main()函数无法执行到下一步。也就是说,虽然启动了子线程,但main()要等待子线程执行完毕。函数局部变量子线程会引起函数阻塞无法退出。
static ThreadRunner mThread("test"); void test() { int mCount = 1; mThread.start([&mCount] { mCount++; printf("thread run...%d\n", mCount); std::chrono::milliseconds sleepDuration(2000); std::this_thread::sleep_for(sleepDuration); return true; }); cout << "test end..\n" << endl; } int main() { test(); cout << "test out..\n" << endl; }
ThreadRunner created. name:test test end.. ThreadRunner started. name:test thread run...2 test out.. 请按任意键继续. . . thread run...1946155304 thread run...1946155305 thread run...1946155306 thread run...1946155307 thread run...1946155308 thread run...1946155309 thread run...1946155310 thread run...1946155311 thread run...1946155312
由于ThreadRunner是全局的,函数test() 退出时并不会引起ThreadRunner析构,所以也不会阻塞main()运行。但是mCount局部变量已经释放,所以子线程中的mCount引用的值是随机数。不要传递局部变量的引用给子线程。
static ThreadRunner *mThread = nullptr; void test(const int mCount) { if (mThread == nullptr) { mThread = new ThreadRunner("test"); } if (mThread->isRunning()) { delete mThread; // 会阻塞等待前一个线程析构,如果不delete,则前一个线程成为野指针 mThread = new ThreadRunner("test2"); } mThread->start([mCount] { printf("thread run...%d\n", mCount); std::chrono::milliseconds sleepDuration(2000); std::this_thread::sleep_for(sleepDuration); printf("thread run.end..%d\n", mCount); return false; }); cout << "test end..\n" << endl; } int main() { test(1); cout << "test out..\n" << endl; test(2); cout << "test out.2.\n" << endl; }
相关推荐
子线程更新主线程数据(再谈多线程)
java 子线程通过观察者模式通知主线程
主要介绍了C#子线程更新UI控件的方法,在桌面应用程序中控制UI界面有着不错的实用价值,需要的朋友可以参考下
c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷!
Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码...
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现结果 技术特点: 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为...
子线程任务发生异常,主线程事务如何回滚
本资源详细介绍了主线程和子线程之间的通信过程,通过实例讲解了参数如何传递
Android ,非MainActivity类中的子线程和UI线程通讯,并且获取子线程传递的信息,更新UI界面。需要使用okHttp类库
C# Winfrom必须掌握的技术,主线程显示数据,子线程获取数据,这是我做项目实际用到的技术。
子线程创建界面组件
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
Android中两个子线程的通信demo
1。 子线程操作主线程的示例 2。 全部源代码
Unity除了一些基本的数据类型,几乎所有的API都不能在子线程中调用,如果项目中有一段很耗时操作,unity可能会出现“卡死...因此针对这个问题再加上查找了一些资料,弄出了一个小工具,可以子线程与主线程的相互访问。
Ios子线程渲染Opengl 的demo, 减少在主线程操作,减少对其他View的影响造成的卡顿。
Qt的子线程无法直接更新主UI,需要发送信号到主线程进行更新,我用的QTableWidget展示数据。
通过窗口传递让主线程触发FIRE事件(子线程不能触发)
Android 通过子线程加载URL图片
Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程...