4
4
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
5
<title>Threads</title>
6
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
6
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
7
7
<link rel="home" href="index.html" title="GLib Reference Manual">
8
8
<link rel="up" href="glib-core.html" title="GLib Core Application Support">
9
9
<link rel="prev" href="glib-The-Main-Event-Loop.html" title="The Main Event Loop">
10
10
<link rel="next" href="glib-Thread-Pools.html" title="Thread Pools">
11
<meta name="generator" content="GTK-Doc V1.18.1 (XML mode)">
11
<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
12
12
<link rel="stylesheet" href="style.css" type="text/css">
14
14
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
228
228
threads. The two notable exceptions from this rule are <a class="link" href="glib-The-Main-Event-Loop.html#GMainLoop" title="GMainLoop"><span class="type">GMainLoop</span></a>
229
229
and <a class="link" href="glib-Asynchronous-Queues.html#GAsyncQueue" title="GAsyncQueue"><span class="type">GAsyncQueue</span></a>, which <span class="emphasis"><em>are</em></span> thread-safe and
230
230
need no further application-level locking to be accessed from
231
multiple threads. Most refcounting functions such as <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-ref"><code class="function">g_object_ref()</code></a>
231
multiple threads. Most refcounting functions such as <a href="./../gobject/gobject/gobject-The-Base-Object-Type.html#g-object-ref"><code class="function">g_object_ref()</code></a>
232
232
are also thread-safe.
297
294
Specifies the type of the <em class="parameter"><code>func</code></em> functions passed to <a class="link" href="glib-Threads.html#g-thread-new" title="g_thread_new ()"><code class="function">g_thread_new()</code></a>
298
295
or <a class="link" href="glib-Threads.html#g-thread-try-new" title="g_thread_try_new ()"><code class="function">g_thread_try_new()</code></a>.
300
<div class="variablelist"><table border="0" class="variablelist">
297
<div class="variablelist"><table border="0">
302
298
<col align="left" valign="top">
307
301
<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
339
333
To free the struct returned by this function, use <a class="link" href="glib-Threads.html#g-thread-unref" title="g_thread_unref ()"><code class="function">g_thread_unref()</code></a>.
340
334
Note that <a class="link" href="glib-Threads.html#g-thread-join" title="g_thread_join ()"><code class="function">g_thread_join()</code></a> implicitly unrefs the <a class="link" href="glib-Threads.html#GThread" title="GThread"><span class="type">GThread</span></a> as well.
342
<div class="variablelist"><table border="0" class="variablelist">
336
<div class="variablelist"><table border="0">
344
337
<col align="left" valign="top">
349
340
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
381
372
If a thread can not be created (due to resource limits),
382
373
<em class="parameter"><code>error</code></em> is set and <a class="link" href="glib-Standard-Macros.html#NULL:CAPS" title="NULL"><code class="literal">NULL</code></a> is returned.
384
<div class="variablelist"><table border="0" class="variablelist">
375
<div class="variablelist"><table border="0">
386
376
<col align="left" valign="top">
391
379
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
452
437
it is running, so it is safe to drop your own reference to it
453
438
if you don't need it anymore.
455
<div class="variablelist"><table border="0" class="variablelist">
440
<div class="variablelist"><table border="0">
457
441
<col align="left" valign="top">
461
443
<td><p><span class="term"><em class="parameter"><code>thread</code></em> :</span></p></td>
462
444
<td>a <a class="link" href="glib-Threads.html#GThread" title="GThread"><span class="type">GThread</span></a>
490
472
to be freed. Use <a class="link" href="glib-Threads.html#g-thread-ref" title="g_thread_ref ()"><code class="function">g_thread_ref()</code></a> to obtain an extra reference if you
491
473
want to keep the GThread alive beyond the <a class="link" href="glib-Threads.html#g-thread-join" title="g_thread_join ()"><code class="function">g_thread_join()</code></a> call.
493
<div class="variablelist"><table border="0" class="variablelist">
475
<div class="variablelist"><table border="0">
495
476
<col align="left" valign="top">
500
479
<td><p><span class="term"><em class="parameter"><code>thread</code></em> :</span></p></td>
576
552
(i.e. comparisons) but you must not use GLib functions (such
577
553
as <a class="link" href="glib-Threads.html#g-thread-join" title="g_thread_join ()"><code class="function">g_thread_join()</code></a>) on these threads.
579
<div class="variablelist"><table border="0" class="variablelist">
555
<div class="variablelist"><table border="0">
581
556
<col align="left" valign="top">
585
558
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
586
559
<td>the <a class="link" href="glib-Threads.html#GThread" title="GThread"><span class="type">GThread</span></a> representing the current thread</td>
607
580
<div class="example">
608
<a name="id655057"></a><p class="title"><b>Example 2. A function which will not work in a threaded environment</b></p>
609
<div class="example-contents">
610
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
613
<td class="listing_lines" align="right"><pre>1
625
<td class="listing_code"><pre class="programlisting"><span class="type">int</span>
626
<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
627
<span class="cbracket">{</span>
628
<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
630
<span class="normal"> </span><span class="comment">/* now do a very complicated calculation to calculate the new</span>
631
<span class="comment"> * number, this might for example be a random number generator</span>
632
<span class="comment"> */</span>
633
<span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
635
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> current_number</span><span class="symbol">;</span>
636
<span class="cbracket">}</span></pre></td>
581
<a name="idp17595376"></a><p class="title"><b>Example 2. A function which will not work in a threaded environment</b></p>
582
<div class="example-contents"><pre class="programlisting">
584
give_me_next_number (void)
586
static int current_number = 0;
588
/* now do a very complicated calculation to calculate the new
589
* number, this might for example be a random number generator
591
current_number = calc_next_number (current_number);
593
return current_number;
643
597
<p><br class="example-break">
652
606
<div class="example">
653
<a name="id655093"></a><p class="title"><b>Example 3. Using GMutex to protected a shared variable</b></p>
654
<div class="example-contents">
655
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
658
<td class="listing_lines" align="right"><pre>1
671
<td class="listing_code"><pre class="programlisting"><span class="type">int</span>
672
<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
673
<span class="cbracket">{</span>
674
<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GMutex</span><span class="normal"> mutex</span><span class="symbol">;</span>
675
<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
676
<span class="normal"> </span><span class="type">int</span><span class="normal"> ret_val</span><span class="symbol">;</span>
678
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">mutex</span><span class="symbol">);</span>
679
<span class="normal"> ret_val </span><span class="symbol">=</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
680
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">mutex</span><span class="symbol">);</span>
682
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> ret_val</span><span class="symbol">;</span>
683
<span class="cbracket">}</span></pre></td>
607
<a name="idp17599680"></a><p class="title"><b>Example 3. Using GMutex to protected a shared variable</b></p>
608
<div class="example-contents"><pre class="programlisting">
610
give_me_next_number (void)
613
static int current_number = 0;
616
g_mutex_lock (&mutex);
617
ret_val = current_number = calc_next_number (current_number);
618
g_mutex_unlock (&mutex);
690
624
<p><br class="example-break">
721
<div class="informalexample">
722
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
725
<td class="listing_lines" align="right"><pre>1
734
<td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
735
<span class="normal"> </span><span class="usertype">GMutex</span><span class="normal"> m</span><span class="symbol">;</span>
736
<span class="normal"> </span><span class="symbol">...</span>
737
<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
739
<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
741
<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
742
<span class="function"><a href="glib-Threads.html#g-mutex-init">g_mutex_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">m</span><span class="symbol">);</span></pre></td>
655
<div class="informalexample"><pre class="programlisting">
664
g_mutex_init (&b->m);
755
673
Calling <a class="link" href="glib-Threads.html#g-mutex-init" title="g_mutex_init ()"><code class="function">g_mutex_init()</code></a> on an already initialized <a class="link" href="glib-Threads.html#GMutex" title="union GMutex"><span class="type">GMutex</span></a> leads
756
674
to undefined behaviour.
758
<div class="variablelist"><table border="0" class="variablelist">
676
<div class="variablelist"><table border="0">
760
677
<col align="left" valign="top">
764
679
<td><p><span class="term"><em class="parameter"><code>mutex</code></em> :</span></p></td>
765
680
<td>an uninitialized <a class="link" href="glib-Threads.html#GMutex" title="union GMutex"><span class="type">GMutex</span></a>
880
786
Calling <a class="link" href="glib-Threads.html#g-mutex-unlock" title="g_mutex_unlock ()"><code class="function">g_mutex_unlock()</code></a> on a mutex that is not locked by the
881
787
current thread leads to undefined behaviour.
883
<div class="variablelist"><table border="0" class="variablelist">
789
<div class="variablelist"><table border="0">
885
790
<col align="left" valign="top">
889
792
<td><p><span class="term"><em class="parameter"><code>mutex</code></em> :</span></p></td>
890
793
<td>a <a class="link" href="glib-Threads.html#GMutex" title="union GMutex"><span class="type">GMutex</span></a>
913
816
<div class="example">
914
<a name="id655947"></a><p class="title"><b>Example 4. Using the <code class="literal">G_LOCK_*</code> convenience macros</b></p>
915
<div class="example-contents">
916
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
919
<td class="listing_lines" align="right"><pre>1
933
<td class="listing_code"><pre class="programlisting"><span class="function"><a href="glib-Threads.html#G-LOCK-DEFINE:CAPS">G_LOCK_DEFINE</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
935
<span class="type">int</span>
936
<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
937
<span class="cbracket">{</span>
938
<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
939
<span class="normal"> </span><span class="type">int</span><span class="normal"> ret_val</span><span class="symbol">;</span>
941
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-LOCK:CAPS">G_LOCK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
942
<span class="normal"> ret_val </span><span class="symbol">=</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
943
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-UNLOCK:CAPS">G_UNLOCK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
945
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> ret_val</span><span class="symbol">;</span>
946
<span class="cbracket">}</span></pre></td>
817
<a name="idp17702016"></a><p class="title"><b>Example 4. Using the <code class="literal">G_LOCK_*</code> convenience macros</b></p>
818
<div class="example-contents"><pre class="programlisting">
819
G_LOCK_DEFINE (current_number);
822
give_me_next_number (void)
824
static int current_number = 0;
827
G_LOCK (current_number);
828
ret_val = current_number = calc_next_number (current_number);
829
G_UNLOCK (current_number);
953
835
<p><br class="example-break">
955
<div class="variablelist"><table border="0" class="variablelist">
837
<div class="variablelist"><table border="0">
957
838
<col align="left" valign="top">
961
840
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
962
841
<td>the name of the lock</td>
1011
884
Works like <a class="link" href="glib-Threads.html#g-mutex-lock" title="g_mutex_lock ()"><code class="function">g_mutex_lock()</code></a>, but for a lock defined with
1012
885
<a class="link" href="glib-Threads.html#G-LOCK-DEFINE:CAPS" title="G_LOCK_DEFINE()"><span class="type">G_LOCK_DEFINE</span></a>.
1014
<div class="variablelist"><table border="0" class="variablelist">
887
<div class="variablelist"><table border="0">
1016
888
<col align="left" valign="top">
1020
890
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
1021
891
<td>the name of the lock</td>
1031
901
Works like <a class="link" href="glib-Threads.html#g-mutex-trylock" title="g_mutex_trylock ()"><code class="function">g_mutex_trylock()</code></a>, but for a lock defined with
1032
902
<a class="link" href="glib-Threads.html#G-LOCK-DEFINE:CAPS" title="G_LOCK_DEFINE()"><span class="type">G_LOCK_DEFINE</span></a>.
1034
<div class="variablelist"><table border="0" class="variablelist">
904
<div class="variablelist"><table border="0">
1036
905
<col align="left" valign="top">
1041
908
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
1058
925
Works like <a class="link" href="glib-Threads.html#g-mutex-unlock" title="g_mutex_unlock ()"><code class="function">g_mutex_unlock()</code></a>, but for a lock defined with
1059
926
<a class="link" href="glib-Threads.html#G-LOCK-DEFINE:CAPS" title="G_LOCK_DEFINE()"><span class="type">G_LOCK_DEFINE</span></a>.
1061
<div class="variablelist"><table border="0" class="variablelist">
928
<div class="variablelist"><table border="0">
1063
929
<col align="left" valign="top">
1067
931
<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
1068
932
<td>the name of the lock</td>
1114
<div class="informalexample">
1115
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
1118
<td class="listing_lines" align="right"><pre>1
1127
<td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
1128
<span class="normal"> </span><span class="usertype">GRecMutex</span><span class="normal"> m</span><span class="symbol">;</span>
1129
<span class="normal"> </span><span class="symbol">...</span>
1130
<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
1132
<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
1134
<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
1135
<span class="function"><a href="glib-Threads.html#g-rec-mutex-init">g_rec_mutex_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">m</span><span class="symbol">);</span></pre></td>
978
<div class="informalexample"><pre class="programlisting">
987
g_rec_mutex_init (&b->m);
1148
996
To undo the effect of <a class="link" href="glib-Threads.html#g-rec-mutex-init" title="g_rec_mutex_init ()"><code class="function">g_rec_mutex_init()</code></a> when a recursive mutex
1149
997
is no longer needed, use <a class="link" href="glib-Threads.html#g-rec-mutex-clear" title="g_rec_mutex_clear ()"><code class="function">g_rec_mutex_clear()</code></a>.
1151
<div class="variablelist"><table border="0" class="variablelist">
999
<div class="variablelist"><table border="0">
1153
1000
<col align="left" valign="top">
1157
1002
<td><p><span class="term"><em class="parameter"><code>rec_mutex</code></em> :</span></p></td>
1158
1003
<td>an uninitialized <a class="link" href="glib-Threads.html#GRecMutex" title="struct GRecMutex"><span class="type">GRecMutex</span></a>
1204
1046
The mutex will only become available again when it is unlocked
1205
1047
as many times as it has been locked.
1207
<div class="variablelist"><table border="0" class="variablelist">
1049
<div class="variablelist"><table border="0">
1209
1050
<col align="left" valign="top">
1213
1052
<td><p><span class="term"><em class="parameter"><code>rec_mutex</code></em> :</span></p></td>
1214
1053
<td>a <a class="link" href="glib-Threads.html#GRecMutex" title="struct GRecMutex"><span class="type">GRecMutex</span></a>
1226
1065
by another thread, it immediately returns <a class="link" href="glib-Standard-Macros.html#FALSE:CAPS" title="FALSE"><code class="literal">FALSE</code></a>. Otherwise
1227
1066
it locks <em class="parameter"><code>rec_mutex</code></em> and returns <a class="link" href="glib-Standard-Macros.html#TRUE:CAPS" title="TRUE"><code class="literal">TRUE</code></a>.
1229
<div class="variablelist"><table border="0" class="variablelist">
1068
<div class="variablelist"><table border="0">
1231
1069
<col align="left" valign="top">
1236
1072
<td><p><span class="term"><em class="parameter"><code>rec_mutex</code></em> :</span></p></td>
1259
1095
Calling <a class="link" href="glib-Threads.html#g-rec-mutex-unlock" title="g_rec_mutex_unlock ()"><code class="function">g_rec_mutex_unlock()</code></a> on a recursive mutex that is not
1260
1096
locked by the current thread leads to undefined behaviour.
1262
<div class="variablelist"><table border="0" class="variablelist">
1098
<div class="variablelist"><table border="0">
1264
1099
<col align="left" valign="top">
1268
1101
<td><p><span class="term"><em class="parameter"><code>rec_mutex</code></em> :</span></p></td>
1269
1102
<td>a <a class="link" href="glib-Threads.html#GRecMutex" title="struct GRecMutex"><span class="type">GRecMutex</span></a>
1373
<div class="informalexample">
1374
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
1377
<td class="listing_lines" align="right"><pre>1
1386
<td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
1387
<span class="normal"> </span><span class="usertype">GRWLock</span><span class="normal"> l</span><span class="symbol">;</span>
1388
<span class="normal"> </span><span class="symbol">...</span>
1389
<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
1391
<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
1393
<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
1394
<span class="function"><a href="glib-Threads.html#g-rw-lock-init">g_rw_lock_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">l</span><span class="symbol">);</span></pre></td>
1206
<div class="informalexample"><pre class="programlisting">
1214
b = g_new (Blob, 1);
1215
g_rw_lock_init (&b->l);
1407
1224
Calling <a class="link" href="glib-Threads.html#g-rw-lock-init" title="g_rw_lock_init ()"><code class="function">g_rw_lock_init()</code></a> on an already initialized <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a> leads
1408
1225
to undefined behaviour.
1410
<div class="variablelist"><table border="0" class="variablelist">
1227
<div class="variablelist"><table border="0">
1412
1228
<col align="left" valign="top">
1416
1230
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1417
1231
<td>an uninitialized <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a>
1459
1270
a read or write lock on <em class="parameter"><code>rw_lock</code></em>, the current thread will block
1460
1271
until all other threads have dropped their locks on <em class="parameter"><code>rw_lock</code></em>.
1462
<div class="variablelist"><table border="0" class="variablelist">
1273
<div class="variablelist"><table border="0">
1464
1274
<col align="left" valign="top">
1468
1276
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1469
1277
<td>a <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a>
1481
1289
a read or write lock on <em class="parameter"><code>rw_lock</code></em>, it immediately returns <a class="link" href="glib-Standard-Macros.html#FALSE:CAPS" title="FALSE"><code class="literal">FALSE</code></a>.
1482
1290
Otherwise it locks <em class="parameter"><code>rw_lock</code></em> and returns <a class="link" href="glib-Standard-Macros.html#TRUE:CAPS" title="TRUE"><code class="literal">TRUE</code></a>.
1484
<div class="variablelist"><table border="0" class="variablelist">
1292
<div class="variablelist"><table border="0">
1486
1293
<col align="left" valign="top">
1491
1296
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1512
1317
Calling <a class="link" href="glib-Threads.html#g-rw-lock-writer-unlock" title="g_rw_lock_writer_unlock ()"><code class="function">g_rw_lock_writer_unlock()</code></a> on a lock that is not held
1513
1318
by the current thread leads to undefined behaviour.
1515
<div class="variablelist"><table border="0" class="variablelist">
1320
<div class="variablelist"><table border="0">
1517
1321
<col align="left" valign="top">
1521
1323
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1522
1324
<td>a <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a>
1538
1340
It is implementation-defined how many threads are allowed to
1539
1341
hold read locks on the same lock simultaneously.
1541
<div class="variablelist"><table border="0" class="variablelist">
1343
<div class="variablelist"><table border="0">
1543
1344
<col align="left" valign="top">
1547
1346
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1548
1347
<td>a <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a>
1591
1387
Calling <a class="link" href="glib-Threads.html#g-rw-lock-reader-unlock" title="g_rw_lock_reader_unlock ()"><code class="function">g_rw_lock_reader_unlock()</code></a> on a lock that is not held
1592
1388
by the current thread leads to undefined behaviour.
1594
<div class="variablelist"><table border="0" class="variablelist">
1390
<div class="variablelist"><table border="0">
1596
1391
<col align="left" valign="top">
1600
1393
<td><p><span class="term"><em class="parameter"><code>rw_lock</code></em> :</span></p></td>
1601
1394
<td>a <a class="link" href="glib-Threads.html#GRWLock" title="struct GRWLock"><span class="type">GRWLock</span></a>
1628
1421
<div class="example">
1629
<a name="id653620"></a><p class="title"><b>Example 6.
1422
<a name="idp20484704"></a><p class="title"><b>Example 6.
1630
1423
Using GCond to block a thread until a condition is satisfied
1632
<div class="example-contents">
1633
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
1636
<td class="listing_lines" align="right"><pre>1
1663
<td class="listing_code"><pre class="programlisting"><span class="usertype">gpointer</span><span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
1664
<span class="usertype">GMutex</span><span class="normal"> data_mutex</span><span class="symbol">;</span>
1665
<span class="usertype">GCond</span><span class="normal"> data_cond</span><span class="symbol">;</span>
1667
<span class="type">void</span>
1668
<span class="function">push_data</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span>
1669
<span class="cbracket">{</span>
1670
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1671
<span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> data</span><span class="symbol">;</span>
1672
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-cond-signal">g_cond_signal</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">);</span>
1673
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1674
<span class="cbracket">}</span>
1676
<span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
1677
<span class="function">pop_data</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
1678
<span class="cbracket">{</span>
1679
<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">;</span>
1681
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1682
<span class="normal"> </span><span class="keyword">while</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">current_data</span><span class="symbol">)</span>
1683
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-cond-wait">g_cond_wait</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1684
<span class="normal"> data </span><span class="symbol">=</span><span class="normal"> current_data</span><span class="symbol">;</span>
1685
<span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
1686
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1688
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> data</span><span class="symbol">;</span>
1689
<span class="cbracket">}</span></pre></td>
1425
<div class="example-contents"><pre class="programlisting">
1426
gpointer current_data = NULL;
1431
push_data (gpointer data)
1433
g_mutex_lock (&data_mutex);
1434
current_data = data;
1435
g_cond_signal (&data_cond);
1436
g_mutex_unlock (&data_mutex);
1444
g_mutex_lock (&data_mutex);
1445
while (!current_data)
1446
g_cond_wait (&data_cond, &data_mutex);
1447
data = current_data;
1448
current_data = NULL;
1449
g_mutex_unlock (&data_mutex);
1696
1455
<p><br class="example-break">
1746
1505
Calling <a class="link" href="glib-Threads.html#g-cond-init" title="g_cond_init ()"><code class="function">g_cond_init()</code></a> on an already-initialised <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a> leads
1747
1506
to undefined behaviour.
1749
<div class="variablelist"><table border="0" class="variablelist">
1508
<div class="variablelist"><table border="0">
1751
1509
<col align="left" valign="top">
1755
1511
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
1756
1512
<td>an uninitialized <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a>
1774
1530
Calling <a class="link" href="glib-Threads.html#g-cond-clear" title="g_cond_clear ()"><code class="function">g_cond_clear()</code></a> for a <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a> on which threads are
1775
1531
blocking leads to undefined behaviour.
1777
<div class="variablelist"><table border="0" class="variablelist">
1533
<div class="variablelist"><table border="0">
1779
1534
<col align="left" valign="top">
1783
1536
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
1784
1537
<td>an initialised <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a>
1808
1561
For this reason, <a class="link" href="glib-Threads.html#g-cond-wait" title="g_cond_wait ()"><code class="function">g_cond_wait()</code></a> must always be used in a loop. See
1809
1562
the documentation for <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a> for a complete example.
1811
<div class="variablelist"><table border="0" class="variablelist">
1564
<div class="variablelist"><table border="0">
1813
1565
<col align="left" valign="top">
1818
1568
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
1852
1602
To easily calculate <em class="parameter"><code>abs_time</code></em> a combination of <a class="link" href="glib-Date-and-Time-Functions.html#g-get-current-time" title="g_get_current_time ()"><code class="function">g_get_current_time()</code></a>
1853
1603
and <a class="link" href="glib-Date-and-Time-Functions.html#g-time-val-add" title="g_time_val_add ()"><code class="function">g_time_val_add()</code></a> can be used.
1855
<div class="variablelist"><table border="0" class="variablelist">
1605
<div class="variablelist"><table border="0">
1857
1606
<col align="left" valign="top">
1862
1609
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
1908
<div class="informalexample">
1909
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
1912
<td class="listing_lines" align="right"><pre>1
1937
<td class="listing_code"><pre class="programlisting"><span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
1938
<span class="function">pop_data_timed</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
1939
<span class="cbracket">{</span>
1940
<span class="normal"> </span><span class="usertype">gint64</span><span class="normal"> end_time</span><span class="symbol">;</span>
1941
<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">;</span>
1943
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1945
<span class="normal"> end_time </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Date-and-Time-Functions.html#g-get-monotonic-time">g_get_monotonic_time</a></span><span class="normal"> </span><span class="symbol">()</span><span class="normal"> </span><span class="symbol">+</span><span class="normal"> </span><span class="number">5</span><span class="normal"> </span><span class="symbol">*</span><span class="normal"> <a href="glib-GDateTime.html#G-TIME-SPAN-SECOND:CAPS">G_TIME_SPAN_SECOND</a></span><span class="symbol">;</span>
1946
<span class="normal"> </span><span class="keyword">while</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">current_data</span><span class="symbol">)</span>
1947
<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="function"><a href="glib-Threads.html#g-cond-wait-until">g_cond_wait_until</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">data_mutex</span><span class="symbol">,</span><span class="normal"> end_time</span><span class="symbol">))</span>
1948
<span class="normal"> </span><span class="cbracket">{</span>
1949
<span class="normal"> </span><span class="comment">// timeout has passed.</span>
1950
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1951
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
1952
<span class="normal"> </span><span class="cbracket">}</span>
1954
<span class="normal"> </span><span class="comment">// there is data for us</span>
1955
<span class="normal"> data </span><span class="symbol">=</span><span class="normal"> current_data</span><span class="symbol">;</span>
1956
<span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
1958
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
1960
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> data</span><span class="symbol">;</span>
1961
<span class="cbracket">}</span></pre></td>
1655
<div class="informalexample"><pre class="programlisting">
1657
pop_data_timed (void)
1662
g_mutex_lock (&data_mutex);
1664
end_time = g_get_monotonic_time () + 5 * G_TIME_SPAN_SECOND;
1665
while (!current_data)
1666
if (!g_cond_wait_until (&data_cond, &data_mutex, end_time))
1668
// timeout has passed.
1669
g_mutex_unlock (&data_mutex);
1673
// there is data for us
1674
data = current_data;
1675
current_data = NULL;
1677
g_mutex_unlock (&data_mutex);
2012
1724
It is good practice to hold the same lock as the waiting thread
2013
1725
while calling this function, though not required.
2015
<div class="variablelist"><table border="0" class="variablelist">
1727
<div class="variablelist"><table border="0">
2017
1728
<col align="left" valign="top">
2021
1730
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
2022
1731
<td>a <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a>
2034
1743
It is good practice to lock the same mutex as the waiting threads
2035
1744
while calling this function, though not required.
2037
<div class="variablelist"><table border="0" class="variablelist">
1746
<div class="variablelist"><table border="0">
2039
1747
<col align="left" valign="top">
2043
1749
<td><p><span class="term"><em class="parameter"><code>cond</code></em> :</span></p></td>
2044
1750
<td>a <a class="link" href="glib-Threads.html#GCond" title="struct GCond"><span class="type">GCond</span></a>
2105
<div class="informalexample">
2106
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
2109
<td class="listing_lines" align="right"><pre>1
2138
<td class="listing_code"><pre class="programlisting"><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GPrivate</span><span class="normal"> name_key </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-PRIVATE-INIT:CAPS">G_PRIVATE_INIT</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="glib-Memory-Allocation.html#g-free">g_free</a></span><span class="symbol">);</span>
2140
<span class="comment">// return value should not be freed</span>
2141
<span class="keyword">const</span><span class="normal"> <a href="glib-Basic-Types.html#gchar">gchar</a> </span><span class="symbol">*</span>
2142
<span class="function">get_local_name</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
2143
<span class="cbracket">{</span>
2144
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-get">g_private_get</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">name_key</span><span class="symbol">);</span>
2145
<span class="cbracket">}</span>
2147
<span class="type">void</span>
2148
<span class="function">set_local_name</span><span class="normal"> </span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> </span><span class="usertype">gchar</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">name</span><span class="symbol">)</span>
2149
<span class="cbracket">{</span>
2150
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-replace">g_private_replace</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">name_key</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">name</span><span class="symbol">));</span>
2151
<span class="cbracket">}</span>
2154
<span class="keyword">static</span><span class="normal"> </span><span class="usertype">GPrivate</span><span class="normal"> count_key</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">// no free function</span>
2156
<span class="normal"><a href="glib-Basic-Types.html#gint">gint</a></span>
2157
<span class="function">get_local_count</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
2158
<span class="cbracket">{</span>
2159
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="glib-Type-Conversion-Macros.html#GPOINTER-TO-INT:CAPS">GPOINTER_TO_INT</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="glib-Threads.html#g-private-get">g_private_get</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">count_key</span><span class="symbol">));</span>
2160
<span class="cbracket">}</span>
2162
<span class="type">void</span>
2163
<span class="function">set_local_count</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">gint</span><span class="normal"> count</span><span class="symbol">)</span>
2164
<span class="cbracket">{</span>
2165
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-set">g_private_set</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">count_key</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="glib-Type-Conversion-Macros.html#GINT-TO-POINTER:CAPS">GINT_TO_POINTER</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">count</span><span class="symbol">));</span>
2166
<span class="cbracket">}</span></pre></td>
1811
<div class="informalexample"><pre class="programlisting">
1812
static GPrivate name_key = G_PRIVATE_INIT (g_free);
1814
// return value should not be freed
1816
get_local_name (void)
1818
return g_private_get (&name_key);
1822
set_local_name (const gchar *name)
1824
g_private_replace (&name_key, g_strdup (name));
1828
static GPrivate count_key; // no free function
1831
get_local_count (void)
1833
return GPOINTER_TO_INT (g_private_get (&count_key));
1837
set_local_count (gint count)
1839
g_private_set (&count_key, GINT_TO_POINTER (count));
2174
<div class="variablelist"><table border="0" class="variablelist">
1844
<div class="variablelist"><table border="0">
2176
1845
<col align="left" valign="top">
2180
1847
<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
2181
1848
<td>a <a class="link" href="glib-Datasets.html#GDestroyNotify" title="GDestroyNotify ()"><span class="type">GDestroyNotify</span></a>
2227
1891
This function differs from <a class="link" href="glib-Threads.html#g-private-replace" title="g_private_replace ()"><code class="function">g_private_replace()</code></a> in the following way:
2228
1892
the <a class="link" href="glib-Datasets.html#GDestroyNotify" title="GDestroyNotify ()"><span class="type">GDestroyNotify</span></a> for <em class="parameter"><code>key</code></em> is not called on the old value.
2230
<div class="variablelist"><table border="0" class="variablelist">
1894
<div class="variablelist"><table border="0">
2232
1895
<col align="left" valign="top">
2237
1898
<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
2259
1920
the previous value was non-<a class="link" href="glib-Standard-Macros.html#NULL:CAPS" title="NULL"><code class="literal">NULL</code></a> then the <a class="link" href="glib-Datasets.html#GDestroyNotify" title="GDestroyNotify ()"><span class="type">GDestroyNotify</span></a> handler for
2260
1921
<em class="parameter"><code>key</code></em> is run on it.
2262
<div class="variablelist"><table border="0" class="variablelist">
1923
<div class="variablelist"><table border="0">
2264
1924
<col align="left" valign="top">
2269
1927
<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
2363
<div class="informalexample">
2364
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
2367
<td class="listing_lines" align="right"><pre>1</pre></td>
2368
<td class="listing_code"><pre class="programlisting"><span class="usertype">GOnce</span><span class="normal"> my_once </span><span class="symbol">=</span><span class="normal"> <a href="glib-Threads.html#G-ONCE-INIT:CAPS">G_ONCE_INIT</a></span><span class="symbol">;</span></pre></td>
2015
<div class="informalexample"><pre class="programlisting">
2016
GOnce my_once = G_ONCE_INIT;
2376
2020
<p class="since">Since 2.4</p>
2400
<div class="informalexample">
2401
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
2404
<td class="listing_lines" align="right"><pre>1
2413
<td class="listing_code"><pre class="programlisting"><span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
2414
<span class="function">get_debug_flags</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
2415
<span class="cbracket">{</span>
2416
<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GOnce</span><span class="normal"> my_once </span><span class="symbol">=</span><span class="normal"> <a href="glib-Threads.html#G-ONCE-INIT:CAPS">G_ONCE_INIT</a></span><span class="symbol">;</span>
2418
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-once">g_once</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">my_once</span><span class="symbol">,</span><span class="normal"> parse_debug_flags</span><span class="symbol">,</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span>
2420
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> my_once</span><span class="symbol">.</span><span class="normal">retval</span><span class="symbol">;</span>
2421
<span class="cbracket">}</span></pre></td>
2044
<div class="informalexample"><pre class="programlisting">
2046
get_debug_flags (void)
2048
static GOnce my_once = G_ONCE_INIT;
2050
g_once (&my_once, parse_debug_flags, NULL);
2052
return my_once.retval;
2429
<div class="variablelist"><table border="0" class="variablelist">
2057
<div class="variablelist"><table border="0">
2431
2058
<col align="left" valign="top">
2436
2061
<td><p><span class="term"><em class="parameter"><code>once</code></em> :</span></p></td>
2471
<div class="informalexample">
2472
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
2475
<td class="listing_lines" align="right"><pre>1
2485
<td class="listing_code"><pre class="programlisting"><span class="keyword">static</span><span class="normal"> </span><span class="usertype">gsize</span><span class="normal"> initialization_value </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
2487
<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="glib-Threads.html#g-once-init-enter">g_once_init_enter</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">initialization_value</span><span class="symbol">))</span>
2488
<span class="normal"> </span><span class="cbracket">{</span>
2489
<span class="normal"> </span><span class="usertype">gsize</span><span class="normal"> setup_value </span><span class="symbol">=</span><span class="normal"> </span><span class="number">42</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">/** initialization code here **/</span>
2491
<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-once-init-leave">g_once_init_leave</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">initialization_value</span><span class="symbol">,</span><span class="normal"> setup_value</span><span class="symbol">);</span>
2492
<span class="normal"> </span><span class="cbracket">}</span>
2494
<span class="comment">/** use initialization_value here **/</span></pre></td>
2096
<div class="informalexample"><pre class="programlisting">
2097
static gsize initialization_value = 0;
2099
if (g_once_init_enter (&initialization_value))
2101
gsize setup_value = 42; /** initialization code here **/
2103
g_once_init_leave (&initialization_value, setup_value);
2106
/** use initialization_value here **/
2502
<div class="variablelist"><table border="0" class="variablelist">
2110
<div class="variablelist"><table border="0">
2504
2111
<col align="left" valign="top">
2509
2114
<td><p><span class="term"><em class="parameter"><code>location</code></em> :</span></p></td>