加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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--)
                {
                }
            }
        }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读