【发布时间】:2017-03-25 11:27:36
【问题描述】:
我在C++ 代码中使用std::thread 不断轮询某些数据并将其添加到缓冲区。我使用C++ lambda 像这样启动线程:
StartMyThread() {
thread_running = true;
the_thread = std::thread { [this] {
while(thread_running) {
GetData();
}
}};
}
thread_running 是在类头中声明的atomic<bool>。这是我的GetData 函数:
GetData() {
//Some heavy logic which needs to be executed in a worker thread
}
接下来我还有一个StopMyThread 函数,我将thread_running 设置为false,以便它退出lambda block 中的while 循环。
StopMyThread() {
thread_running = false;
the_thread.join();
}
效果很好。线程启动和停止而不会崩溃。
此 C++ 代码用于 iOS、Android、OS X 和 Windows。我的应用程序 UI 有一个按钮,需要我在按下按钮时启动和停止线程;这个按钮在某些场合可以经常使用。在停止或启动线程时,我可以看到 UI 出现瞬间延迟。
我的问题是: 在 C++ 中,这是频繁启动/停止线程的正确方法吗? -时间。据我了解,创建一个新线程会使操作系统分配大量新资源,这可能是耗时的。我认为这是我正在做的错误。我怎样才能避免这种情况?
如何在应用程序生命周期内不重复分配新线程的情况下使用同一个线程,并在需要时播放/暂停它?
【问题讨论】:
-
延迟也可能是你在等待旧线程退出。 (如果你有两个线程使用相同的
thread_running值,你会很伤心!) -
您可以通过让线程等待
std::mutex来暂停线程。 -
当心:请参阅 blogs.msdn.microsoft.com/oldnewthing/20031209-00/?p=41573 了解为什么通用
suspend_thread函数不是一个好主意。 (示例是关于 Windows 上的 C#,但原则适用于任何地方。)如果您确实使用互斥锁使其等待,则必须仔细考虑阻塞 UI 线程。 -
std::mutex+std::condition_variable。resume函数只会执行 `notify_one -
我知道这个问题很老了,但我只想指出,与计算机的速度相比,“按钮频繁按下”仍然非常缓慢。停止和启动线程。
标签: c++ c++11 lambda c++14 stdthread