互斥体意在确保程序中的一段代码任何时候最多被一个线程执行。
xxxxxxxxxx
41void QMutex::lock(); // 锁定互斥体,若该互斥体已被其它线程锁定则阻塞,直至其被解锁
2void QMutex::unlock(); // 解锁互斥体,阻塞于锁定该互斥体的线程将被唤醒,从锁定中返回
3bool QMutex::try_lock(); // 试锁互斥体,锁定成功返回true,已被其它线程锁定返回false
4bool QMutex::tryLock(int timeout = 0); // 试锁互斥体,锁定成功返回true,已被其它线程锁定最多阻塞timeout毫秒后返回false
QMutexLocker类的构造函数接受一个QMutex类型的互斥体对象参数并将其锁定,在析构函数中将其解锁。因此QMutexLocker对象的生命周期决定了被互斥体保护的代码范围。
xxxxxxxxxx
11QMutexLocker::QMutexLocker(QMutex* mutex);
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Mutex的控制台(Console)项目。
C:\Users\Minwei\Projects\Qt\Mutex\main.cpp:
xxxxxxxxxx
771
2using namespace std;
3
4
5
6
7
8unsigned int g_cn = 0;
9QMutex g_mutex;
10
11class WorkThread: public QThread
12{
13public:
14 WorkThread(char ch): m_ch(ch)
15 {
16 }
17
18protected:
19 /* 调用lock方法锁定互斥体
20 void run()
21 {
22 for (unsigned int i = 0; i < 1000000; i++) {
23 g_mutex.lock();
24 ++g_cn;
25 g_mutex.unlock();
26 }
27 }
28 */
29 /* 调用try_lock方法锁定互斥体
30 void run()
31 {
32 for (unsigned int i = 0; i < 1000000; i++) {
33 while (!g_mutex.try_lock()) cout << m_ch << flush;
34 ++g_cn;
35 g_mutex.unlock();
36 }
37 }
38 */
39 /* 调用tryLock方法锁定互斥体
40 void run()
41 {
42 for (unsigned int i = 0; i < 1000000; i++) {
43 while (!g_mutex.tryLock(10)) cout << m_ch << flush;
44 ++g_cn;
45 g_mutex.unlock();
46 }
47 }
48 */
49 // 利用QMutexLocker对象的生命周期管理锁定范围
50 void run()
51 {
52 for (unsigned int i = 0; i < 1000000; i++) {
53 QMutexLocker locker(&g_mutex);
54 ++g_cn;
55 }
56 }
57
58private:
59 char m_ch;
60};
61
62int main(int argc, char *argv[])
63{
64 QCoreApplication a(argc, argv);
65
66 WorkThread work1('|'), work2('_');
67
68 work1.start();
69 work2.start();
70
71 work1.wait();
72 work2.wait();
73
74 cout << g_cn << endl;
75
76 return a.exec();
77}
运行效果如图所示:
运行效果如图所示:
运行效果如图所示:
运行效果如图所示: