欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

关于多线程同步有关问题(不同对象的同一代码是否也需要同步)

更新时间: 2014-01-05 02:44:25 责任编辑: Author_N1

 

关于多线程同步问题(不同对象的同一代码是否也需要同步)
最近初学Qt,一直以来对多线程等都不是特别熟悉,这几天学Qt遇到了一个疑惑,希望大家指导指导。

学习用书:C++ GUI Qt 4 编程(第二版)
问题:    Page 258,代码如下。就是在使用QMutex进行线程的同步执行时,使用两个按钮分别打印A和B,点击A按钮开始A线程,点击B按钮开始B线程,A线程开始后,按钮就会变成stop,再次点击stop就可以关闭A线程,B也一样,A和B是两个不同的对象。
    我主要的问题是,在 void Thread::stop() 里,不需要对stopped上锁,我的理解是A和B是两个不同的对象,他们的stopped是独立的吧,所以A操作stopped时,B也stopped应该没影响,需要上锁的一般是全局变量什么的吧?
    按照我这样的理解,但是我又测试了一下,在 void Thread::stop() 的stopped下面增加一个sleep(5),然后我都开启了A、B线程,然后又关闭了B,但是在5秒内却关闭不了A,又让我感觉它们处理的是同一个stopped,希望各位给予一个答复,感激不尽。


void Thread::run()
{

    forever{
        mutex.lock();
        if(stopped){
            stopped = false;
            mutex.unlock();
            break;
        }
        mutex.unlock();
        std::cerr << qPrintable(messageStr);
    }

    std::cerr << std::endl;
}

void Thread::stop()
{
    mutex.lock();
    stopped = true;
    mutex.unlock();
}

--参考方法--
因为在 void Thread::stop() 的stopped下面增加一个sleep(5),这时没有mutex.unlock(),stop()不能重入。

可以在 void Thread::stop() 的mutex.unlock();下面增加一个sleep(5),试一试。已经解锁,可以重入。
--参考方法--
这个不需要加锁,前提stopped非静态的
--参考方法--
这里根本不需要加锁,你理解的没错,这个不同对象的各自变量根本无关。但有一点,这个锁可不是这么回事,虽然他是属于各自类的成员变量,但是一旦锁住其余的绝对进不去。你不可以想成二个人有一模一样的锁,我锁了不影响其余的。这个东西可不是这样的。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:44:25
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/13819/
本文WWW.DOC100.NET DOC100.NET版权所有。