1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/src/tools/qsemaphore.cpp:45 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>QSemaphore Class</title>
<style type="text/css"><!--
fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">Home</font></a>
| <a href="classes.html">
<font color="#004faf">All Classes</font></a>
| <a href="mainclasses.html">
<font color="#004faf">Main Classes</font></a>
| <a href="annotated.html">
<font color="#004faf">Annotated</font></a>
| <a href="groups.html">
<font color="#004faf">Grouped Classes</font></a>
| <a href="functions.html">
<font color="#004faf">Functions</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>QSemaphore Class Reference</h1>
<p>The QSemaphore class provides a robust integer semaphore.
<a href="#details">More...</a>
<p>All the functions in this class are <a href="threads.html#threadsafe">thread-safe</a> when Qt is built with thread support.</p>
<p><tt>#include <<a href="qsemaphore-h.html">qsemaphore.h</a>></tt>
<p><a href="qsemaphore-members.html">List of all member functions.</a>
<h2>Public Members</h2>
<ul>
<li class=fn><a href="#QSemaphore"><b>QSemaphore</b></a> ( int maxcount )</li>
<li class=fn>virtual <a href="#~QSemaphore"><b>~QSemaphore</b></a> ()</li>
<li class=fn>int <a href="#available"><b>available</b></a> () const</li>
<li class=fn>int <a href="#total"><b>total</b></a> () const</li>
<li class=fn>int <a href="#operator++"><b>operator++</b></a> ( int )</li>
<li class=fn>int <a href="#operator--"><b>operator--</b></a> ( int )</li>
<li class=fn>int <a href="#operator+-eq"><b>operator+=</b></a> ( int n )</li>
<li class=fn>int <a href="#operator--eq"><b>operator-=</b></a> ( int n )</li>
<li class=fn>bool <a href="#tryAccess"><b>tryAccess</b></a> ( int n )</li>
</ul>
<hr><a name="details"></a><h2>Detailed Description</h2>
The QSemaphore class provides a robust integer semaphore.
<p>
<p> A QSemaphore can be used to serialize thread execution, in a
similar way to a <a href="qmutex.html">QMutex</a>. A semaphore differs from a mutex, in
that a semaphore can be accessed by more than one thread at a
time.
<p> For example, suppose we have an application that stores data in a
large tree structure. The application creates 10 threads
(commonly called a thread pool) to perform searches on the tree.
When the application searches the tree for some piece of data, it
uses one thread per base node to do the searching. A semaphore
could be used to make sure that two threads don't try to search
the same branch of the tree at the same time.
<p> A non-computing example of a semaphore would be dining at a
restuarant. A semaphore is initialized to have a maximum count
equal to the number of chairs in the restuarant. As people
arrive, they want a seat. As seats are filled, the semaphore is
accessed, once per person. As people leave, the access is
released, allowing more people to enter. If a party of 10 people
want to be seated, but there are only 9 seats, those 10 people
will wait, but a party of 4 people would be seated (taking the
available seats to 5, making the party of 10 people wait longer).
<p> When a semaphore is created it is given a number which is the
maximum number of concurrent accesses it will permit. Accesses to
the sempahore are gained using <a href="#operator++">operator++</a>() or <a href="#operator+-eq">operator+=</a>(), and
released with <a href="#operator--">operator--</a>() or <a href="#operator--eq">operator-=</a>(). The number of
accesses allowed is retrieved with <a href="#available">available</a>(), and the total
number with <a href="#total">total</a>(). Note that the incrementing functions will
block if there aren't enough available accesses. Use <a href="#tryAccess">tryAccess</a>()
if you want to acquire accesses without blocking.
<p>See also <a href="environment.html">Environment Classes</a> and <a href="thread.html">Threading</a>.
<hr><h2>Member Function Documentation</h2>
<h3 class=fn><a name="QSemaphore"></a>QSemaphore::QSemaphore ( int maxcount )
</h3>
Creates a new semaphore. The semaphore can be concurrently
accessed at most <em>maxcount</em> times.
<h3 class=fn><a name="~QSemaphore"></a>QSemaphore::~QSemaphore ()<tt> [virtual]</tt>
</h3>
Destroys the semaphore.
<p> <b>Warning:</b> If you destroy a semaphore that has accesses in use the
resultant behavior is undefined.
<h3 class=fn>int <a name="available"></a>QSemaphore::available () const
</h3>
Returns the number of accesses currently available to the
semaphore.
<h3 class=fn>int <a name="operator++"></a>QSemaphore::operator++ ( int )
</h3>
Postfix ++ operator.
<p> Try to get access to the semaphore. If <a href="#available">available</a>() == 0, this
call will block until it can get access, i.e. until <a href="#available">available</a>() >
0.
<h3 class=fn>int <a name="operator+-eq"></a>QSemaphore::operator+= ( int n )
</h3>
Try to get access to the semaphore. If <a href="#available">available</a>() < <em>n</em>, this
call will block until it can get all the accesses it wants, i.e.
until <a href="#available">available</a>() >= <em>n</em>.
<h3 class=fn>int <a name="operator--"></a>QSemaphore::operator-- ( int )
</h3>
Postfix -- operator.
<p> Release access of the semaphore. This wakes all threads waiting
for access to the semaphore.
<h3 class=fn>int <a name="operator--eq"></a>QSemaphore::operator-= ( int n )
</h3>
Release <em>n</em> accesses to the semaphore.
<h3 class=fn>int <a name="total"></a>QSemaphore::total () const
</h3>
Returns the total number of accesses to the semaphore.
<h3 class=fn>bool <a name="tryAccess"></a>QSemaphore::tryAccess ( int n )
</h3>
Try to get access to the semaphore. If <a href="#available">available</a>() < <em>n</em>, this
function will return FALSE immediately. If <a href="#available">available</a>() >= <em>n</em>,
this function will take <em>n</em> accesses and return TRUE. This
function does <em>not</em> block.
<!-- eof -->
<hr><p>
This file is part of the <a href="index.html">Qt toolkit</a>.
Copyright © 1995-2007
<a href="http://www.trolltech.com/">Trolltech</a>. All Rights Reserved.<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2007
<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a>
<td align=right><div align=right>Qt 3.3.8</div>
</table></div></address></body>
</html>
|