c – 如何根据用户请求安全地停止正在运行的线程?
发布时间:2020-12-16 10:15:59 所属栏目:百科 来源:网络整理
导读:我正处于根据GUI上的用户操作在线程运行时必须终止线程的情况.我在 Windows上使用Qt 4.5.2.一种方法是: class MyThread : public QThread{ QMutex mutex; bool stop; public: MyThread() : stop(false) {} void requestStop() { QMutexLocker(mutex); stop
我正处于根据GUI上的用户操作在线程运行时必须终止线程的情况.我在
Windows上使用Qt 4.5.2.一种方法是:
class MyThread : public QThread { QMutex mutex; bool stop; public: MyThread() : stop(false) {} void requestStop() { QMutexLocker(&mutex); stop = true; } void run() { while(counter1--) { QMutexLocker(&mutex); if (stop) return; while(counter2--) { } } } }; 请注意,上述代码很少.运行功能在完成之前最多需要20秒,所以我想避免在循环中锁定和解锁互斥变量.有没有比这种方法更快的方法. 提前致谢. 解决方法
首先,看起来你不需要在你的整个内循环周围需要一个互斥量,就像其他人所说的那样围绕if(停止)表达式,但我可能会错过你的一些应用程序上下文来明确地说出来.也许你需要requestStop()来阻塞,直到线程退出.
如果减少的互斥范围适合您,那么如果将停止变量声明为“volatile”,则根本不需要互斥锁. “volatile”关键字导致(至少在VC下)读取/写入内存屏障围绕访问停止,这意味着您的requestStop()调用将保证传递给您的线程而不是缓存.以下代码应该可以在多核处理器上正常工作. class MyThread : public QThread { volatile bool stop; public: MyThread() : stop(false) {} void requestStop() { stop = true; } void run() { while(counter1--) { if (stop) return; while(counter2--) { } } } }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |