Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
src_corelib_thread_qsemaphore.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
4#include <QSemaphore>
5#include <QSemaphoreReleaser>
6#include <chrono>
7
8void examples()
9{
10 {
11 //! [0]
12 QSemaphore sem(5); // sem.available() == 5
13
14 sem.acquire(3); // sem.available() == 2
15 sem.acquire(2); // sem.available() == 0
16 sem.release(5); // sem.available() == 5
17 sem.release(5); // sem.available() == 10
18
19 sem.tryAcquire(1); // sem.available() == 9, returns true
20 sem.tryAcquire(250); // sem.available() == 9, returns false
21 //! [0]
22 }
23
24 {
25 //! [1]
26 QSemaphore sem(5); // a semaphore that guards 5 resources
27 sem.acquire(5); // acquire all 5 resources
28 sem.release(5); // release the 5 resources
29 sem.release(10); // "create" 10 new resources
30 //! [1]
31 }
32
33 {
34 //! [2]
35 QSemaphore sem(5); // sem.available() == 5
36 sem.tryAcquire(250); // sem.available() == 5, returns false
37 sem.tryAcquire(3); // sem.available() == 2, returns true
38 //! [2]
39 }
40
41 {
42 //! [3]
43 QSemaphore sem(5); // sem.available() == 5
44 sem.tryAcquire(250, 1000); // sem.available() == 5, waits 1000 milliseconds and returns false
45 sem.tryAcquire(3, 30000); // sem.available() == 2, returns true without waiting
46 //! [3]
47 }
48
49 {
50 using namespace std::chrono_literals;
51
52 //! [tryAcquire-QDeadlineTimer]
53 QSemaphore sem(5); // sem.available() == 5
54 sem.tryAcquire(250, QDeadlineTimer(1000)); // sem.available() == 5, waits 1000 milliseconds and returns false
55 sem.tryAcquire(3, QDeadlineTimer(30s)); // sem.available() == 2, returns true without waiting
56 //! [tryAcquire-QDeadlineTimer]
57 }
58
59 QSemaphore sem(5);
60
61 {
62 //! [4]
63 // ... do something that may throw or return early
64 sem.release();
65 //! [4]
66 }
67
68 {
69 //! [5]
70 const QSemaphoreReleaser releaser(sem);
71 // ... do something that may throw or early return
72 // implicitly calls sem.release() here and at every other return in between
73 //! [5]
74 }
75
76 {
77 bool someCondition;
78
79 //! [6]
80 { // some scope
81 QSemaphoreReleaser releaser; // does nothing
82 // ...
83 if (someCondition) {
84 releaser = QSemaphoreReleaser(sem);
85 // ...
86 }
87 // ...
88 } // conditionally calls sem.release(), depending on someCondition
89 //! [6]
90 }
91
92 {
93 QSemaphoreReleaser releaser;
94
95 //! [7]
96 releaser.cancel(); // avoid releasing old semaphore()
97 releaser = QSemaphoreReleaser(sem, 42);
98 // now will call sem.release(42) when 'releaser' is destroyed
99 //! [7]
100 }
101}
bool examples()
[3]