线程的互斥和同步(4)- Qt中的互斥锁(QMutex和QMutexLocker)

16 篇文章 6 订阅

上一篇文章主要介绍了Windows的互斥锁
线程的互斥和同步(3)- Windows的互斥锁

Linux也有自己API来操作互斥锁,对于跨平台的操作,Qt帮助我们使用一套代码实现相同的效果。
Qt中使用类 QMutexQMutexLocker 来实现和管理互斥锁。


  1. QMutex 的主要函数有:
  • lock (); 加锁,如果该互斥锁被占用,该函数阻塞,直到互斥锁被释放。
  • unlock (); 解锁
  • bool tryLock (int timeout = 0);
    表示尝试去加锁,timeout 为超时时间。如果互斥锁为可用状态,该函数会占用该互斥锁,并返回 true ,否则返回 false 。如果互斥锁被另一个线程占用,该函数会等待 timeout 毫秒直到互斥锁为可用状态。
  1. QMutexLocker 类的主要作用是用来管理 QMutex
    使用 QMutexLocker 的好处是,可以防止线程死锁。
    该对象在构造的时候加锁,析构的时候解锁。

下面是一个关于互斥锁的使用例子,
同样使用了 CThread,头文件:

#include <QMutex>
class QtMutexThread : public CThread
{
public:
	void run(void) override;

private:
    static QMutex m_mutex;
};

源文件:

QMutex QtMutexThread::m_mutex;
int number = 0;

void QtMutexThread::run(void)
{
	while (1)
	{
		{
            QMutexLocker locker(&m_mutex);
			std::cout << "Current Thread: " << ::GetCurrentThreadId() \
			          << ", Value: " << number++ << std::endl;
		}

		Sleep(1000);
	}
}

调用部分:

int main(int argc, char *argv[])
{
	QtMutexThread thread1;
    QtMutexThread thread2;
    QtMutexThread thread3;

    thread1.start();
    thread2.start();
    thread3.start();

    thread1.wait();
    thread2.wait();
    thread3.wait();
}

输出结果:
Current Thread: 14668, Value: 0
Current Thread: 1496, Value: 1
Current Thread: 16604, Value: 2
Current Thread: 14668, Value: 3
Current Thread: 1496, Value: 4
Current Thread: 16604, Value: 5
Current Thread: 14668, Value: 6
Current Thread: 1496, Value: 7
Current Thread: 16604, Value: 8
Current Thread: 14668, Value: 9
Current Thread: 1496, Value: 10
Current Thread: 16604, Value: 11
Current Thread: 14668, Value: 12
Current Thread: 1496, Value: 13


作者:douzhq
个人主页:不会飞的纸飞机
文章同步页(可下载完整代码):线程的互斥和同步(4)- Qt中的互斥锁(QMutex和QMutexLocker)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值