1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3
<title>glibmm 2.4: thread/thread.cc</title>
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
<title>glibmm: thread/thread.cc</title>
4
<link href="tabs.css" rel="stylesheet" type="text/css">
4
5
<link href="doxygen.css" rel="stylesheet" type="text/css">
6
<body bgcolor="#ffffff">
7
<table border="0" width="100%">
9
<td width="10%" height="40"><img src="../../images/gtkmm_logo.gif" alt="logo" border="0" width="100%" height="100%"/></td>
10
<td width="90%" height="40"><img src="../../images/top.gif" alt="top" width="100%" height="40"/></td>
14
<a class="qindex" href="http://www.gtkmm.org/documentation.shtml">Main Page</a>
15
<a class="qindex" href="namespaces.html">glibmm Namespaces</a>
16
<a href="../../../../gtkmm-2.4/docs/tutorial/html/index.html"> Book</a>
20
<!-- begin main content -->
22
<!-- Generated by Doxygen 1.5.9 -->
7
<!-- Generated by Doxygen 1.5.8 -->
8
<div class="navigation" id="top">
11
<li><a href="index.html"><span>Main Page</span></a></li>
12
<li><a href="pages.html"><span>Related Pages</span></a></li>
13
<li><a href="modules.html"><span>Modules</span></a></li>
14
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
15
<li><a href="annotated.html"><span>Classes</span></a></li>
16
<li><a href="examples.html"><span>Examples</span></a></li>
23
20
<div class="contents">
24
21
<h1>thread/thread.cc</h1>A glibmm thread example.<p>
25
22
<div class="fragment"><pre class="fragment">
26
<span class="preprocessor">#include <<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/iostream.html">iostream</a>></span>
27
<span class="preprocessor">#include <queue></span>
28
<span class="preprocessor">#include <<a class="code" href="random_8h.html">glibmm/random.h</a>></span>
29
<span class="preprocessor">#include <<a class="code" href="thread_8h.html">glibmm/thread.h</a>></span>
30
<span class="preprocessor">#include <<a class="code" href="timer_8h.html">glibmm/timer.h</a>></span>
23
<span class="preprocessor">#include <<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00777.html">iostream</a>></span>
24
<span class="preprocessor">#include <<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00839.html">queue</a>></span>
25
<span class="preprocessor">#include <glibmm/random.h></span>
26
<span class="preprocessor">#include <glibmm/thread.h></span>
27
<span class="preprocessor">#include <glibmm/timer.h></span>
33
30
<span class="keyword">namespace</span>
36
<span class="keyword">class </span>MessageQueue : <span class="keyword">public</span> sigc::<a name="_a0"></a><a class="code" href="classsigc_1_1trackable.html">trackable</a>
33
<span class="keyword">class </span>MessageQueue : <span class="keyword">public</span> sigc::<a name="_a0"></a><a class="codeRef" doxygen="libsigc++-2.0.tag:http://library.gnome.org/devel/libsigc++/unstable/" href="http://library.gnome.org/devel/libsigc++/unstable/structsigc_1_1trackable.html">trackable</a>
38
35
<span class="keyword">public</span>:
43
40
<span class="keywordtype">void</span> consumer();
45
42
<span class="keyword">private</span>:
46
<a name="_a1"></a><a class="code" href="classGlib_1_1Mutex.html" title="Represents a mutex (mutual exclusion).">Glib::Mutex</a> mutex_;
47
<a name="_a2"></a><a class="code" href="classGlib_1_1Cond.html" title="An opaque data structure to represent a condition.">Glib::Cond</a> cond_push_;
48
<a class="code" href="classGlib_1_1Cond.html" title="An opaque data structure to represent a condition.">Glib::Cond</a> cond_pop_;
49
<a name="_a3"></a><a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1queue.html">std::queue<int></a> queue_;
43
<a name="_a1"></a><a class="code" href="classGlib_1_1Mutex.html" title="Represents a mutex (mutual exclusion).">Glib::Mutex</a> mutex_;
44
<a name="_a2"></a><a class="code" href="classGlib_1_1Cond.html" title="An opaque data structure to represent a condition.">Glib::Cond</a> cond_push_;
45
<a class="code" href="classGlib_1_1Cond.html" title="An opaque data structure to represent a condition.">Glib::Cond</a> cond_pop_;
46
<a name="_a3"></a><a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00523.html">std::queue<int></a> queue_;
63
60
<span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < 200; ++i)
66
<a name="_a5"></a><a class="code" href="classGlib_1_1Mutex_1_1Lock.html" title="Utility class for exception-safe mutex locking.">Glib::Mutex::Lock</a> lock (mutex_);
63
<a name="_a5"></a><a class="code" href="classGlib_1_1Mutex_1_1Lock.html" title="Utility class for exception-safe mutex locking.">Glib::Mutex::Lock</a> <a name="a6"></a><a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01000.html#g2bdabeb51d7e55d6358ad0857843ebea">lock</a> (mutex_);
68
65
<span class="keywordflow">while</span>(queue_.size() >= 64)
69
66
cond_pop_.wait(mutex_);
72
<a name="a6"></a><a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a81">std::cout</a> << <span class="charliteral">'*'</span>;
73
<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a81">std::cout</a>.flush();
69
<a name="a7"></a><a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#af93fdf0812752e0e02c501dea1b38f0">std::cout</a> << <span class="charliteral">'*'</span>;
70
<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#af93fdf0812752e0e02c501dea1b38f0">std::cout</a>.flush();
75
72
cond_push_.signal();
78
<span class="keywordflow">if</span>(rand.<a name="a7"></a><a class="code" href="classGlib_1_1Rand.html#4d90f1e3ef59d0b071efa0445b6fb469">get_bool</a>())
75
<span class="keywordflow">if</span>(rand.<a name="a8"></a><a class="code" href="classGlib_1_1Rand.html#4d90f1e3ef59d0b071efa0445b6fb469">get_bool</a>())
79
76
<span class="keywordflow">continue</span>;
81
<a name="a8"></a><a class="code" href="namespaceGlib.html#5d75264c8b47f13fb33f973b0d4fc73e">Glib::usleep</a>(rand.<a name="a9"></a><a class="code" href="classGlib_1_1Rand.html#182b9a36db153d316baf5efb1ece9fd7">get_int_range</a>(0, 100000));
78
<a name="a9"></a><a class="code" href="namespaceGlib.html#5d75264c8b47f13fb33f973b0d4fc73e">Glib::usleep</a>(rand.<a name="a10"></a><a class="code" href="classGlib_1_1Rand.html#182b9a36db153d316baf5efb1ece9fd7">get_int_range</a>(0, 100000));
89
86
<span class="keywordflow">for</span>(;;)
92
<a class="code" href="classGlib_1_1Mutex_1_1Lock.html" title="Utility class for exception-safe mutex locking.">Glib::Mutex::Lock</a> lock (mutex_);
89
<a class="code" href="classGlib_1_1Mutex_1_1Lock.html" title="Utility class for exception-safe mutex locking.">Glib::Mutex::Lock</a> <a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01000.html#g2bdabeb51d7e55d6358ad0857843ebea">lock</a> (mutex_);
94
91
<span class="keywordflow">while</span>(queue_.empty())
95
92
cond_push_.wait(mutex_);
97
94
<span class="keyword">const</span> <span class="keywordtype">int</span> i = queue_.front();
99
<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a81">std::cout</a> << <span class="stringliteral">"\x08 \x08"</span>;
100
<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a81">std::cout</a>.flush();
96
<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#af93fdf0812752e0e02c501dea1b38f0">std::cout</a> << <span class="stringliteral">"\x08 \x08"</span>;
97
<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#af93fdf0812752e0e02c501dea1b38f0">std::cout</a>.flush();
102
99
cond_pop_.signal();
118
115
<span class="keywordtype">int</span> main(<span class="keywordtype">int</span>, <span class="keywordtype">char</span>**)
120
<a name="a10"></a><a class="code" href="group__Threads.html#gb26d01c776801f1fff00753e97af4fc7" title="Initializes the GLib thread system.">Glib::thread_init</a>();
117
<a name="a11"></a><a class="code" href="group__Threads.html#gb26d01c776801f1fff00753e97af4fc7" title="Initializes the GLib thread system.">Glib::thread_init</a>();
122
119
MessageQueue queue;
124
<a name="_a11"></a><a class="code" href="classGlib_1_1Thread.html" title="Represents a running thread.">Glib::Thread</a> *<span class="keyword">const</span> producer = <a name="a12"></a><a class="code" href="classGlib_1_1Thread.html#b165854ff2fc9b454ee4d97050485782" title="Creates a new thread with the priority THREAD_PRIORITY_NORMAL.">Glib::Thread::create</a>(
125
<a name="a13"></a><a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/group__s20__3__8__memadaptors.html#ga2">sigc::mem_fun</a>(queue, &MessageQueue::producer), <span class="keyword">true</span>);
121
<a name="_a12"></a><a class="code" href="classGlib_1_1Thread.html" title="Represents a running thread.">Glib::Thread</a> *<span class="keyword">const</span> producer = <a name="a13"></a><a class="code" href="classGlib_1_1Thread.html#b165854ff2fc9b454ee4d97050485782" title="Creates a new thread with the priority THREAD_PRIORITY_NORMAL.">Glib::Thread::create</a>(
122
<a name="a14"></a><a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01024.html#g46b3aee55bddccc454ea4f8edc26ffa7">sigc::mem_fun</a>(queue, &MessageQueue::producer), <span class="keyword">true</span>);
127
124
<a class="code" href="classGlib_1_1Thread.html" title="Represents a running thread.">Glib::Thread</a> *<span class="keyword">const</span> consumer = <a class="code" href="classGlib_1_1Thread.html#b165854ff2fc9b454ee4d97050485782" title="Creates a new thread with the priority THREAD_PRIORITY_NORMAL.">Glib::Thread::create</a>(
128
<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/group__s20__3__8__memadaptors.html#ga2">sigc::mem_fun</a>(queue, &MessageQueue::consumer), <span class="keyword">true</span>);
125
<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01024.html#g46b3aee55bddccc454ea4f8edc26ffa7">sigc::mem_fun</a>(queue, &MessageQueue::consumer), <span class="keyword">true</span>);
130
producer-><a name="a14"></a><a class="code" href="classGlib_1_1Thread.html#b95e51699279fd84c9577c45d76b0d8e" title="Waits until the thread finishes.">join</a>();
127
producer-><a name="a15"></a><a class="code" href="classGlib_1_1Thread.html#b95e51699279fd84c9577c45d76b0d8e" title="Waits until the thread finishes.">join</a>();
131
128
consumer-><a class="code" href="classGlib_1_1Thread.html#b95e51699279fd84c9577c45d76b0d8e" title="Waits until the thread finishes.">join</a>();
133
<a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a81">std::cout</a> << <a name="a15"></a><a class="codeRef" doxygen="libstdc++.tag.xml:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespacestd.html#a688">std::endl</a>;
130
<a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#af93fdf0812752e0e02c501dea1b38f0">std::cout</a> << <a name="a16"></a><a class="codeRef" doxygen="libstdc++.tag:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00969.html#9e2ba1ed9813a1f03adc9a87dbf491a5">std::endl</a>;
135
132
<span class="keywordflow">return</span> 0;
138
135
</pre></div> </div>
139
</div> <!-- end main content -->
142
Generated for glibmm 2.4 by <a href="http://www.doxygen.org/index.html">
143
Doxygen</a> 1.5.9 © 1997-2001</small></address>
136
<hr size="1"><address style="text-align: right;"><small>Generated on Fri Aug 28 16:44:56 2009 for glibmm by 
137
<a href="http://www.doxygen.org/index.html">
138
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>