OSDN Git Service

FIRST REPOSITORY
[eos/hostdependOTHERS.git] / HP / util / HP / man / man3 / Tcl_MutexFinalize.3
1 '\"
2 '\" Copyright (c) 1999 Scriptics Corporation
3 '\" Copyright (c) 1998 Sun Microsystems, Inc.
4 '\"
5 '\" See the file "license.terms" for information on usage and redistribution
6 '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
7 '\" 
8 '\" RCS: @(#) $Id: Thread.3,v 1.11 2000/04/25 23:03:53 hobbs Exp $
9 '\" 
10 '\" The definitions below are for supplemental macros used in Tcl/Tk
11 '\" manual entries.
12 '\"
13 '\" .AP type name in/out ?indent?
14 '\"     Start paragraph describing an argument to a library procedure.
15 '\"     type is type of argument (int, etc.), in/out is either "in", "out",
16 '\"     or "in/out" to describe whether procedure reads or modifies arg,
17 '\"     and indent is equivalent to second arg of .IP (shouldn't ever be
18 '\"     needed;  use .AS below instead)
19 '\"
20 '\" .AS ?type? ?name?
21 '\"     Give maximum sizes of arguments for setting tab stops.  Type and
22 '\"     name are examples of largest possible arguments that will be passed
23 '\"     to .AP later.  If args are omitted, default tab stops are used.
24 '\"
25 '\" .BS
26 '\"     Start box enclosure.  From here until next .BE, everything will be
27 '\"     enclosed in one large box.
28 '\"
29 '\" .BE
30 '\"     End of box enclosure.
31 '\"
32 '\" .CS
33 '\"     Begin code excerpt.
34 '\"
35 '\" .CE
36 '\"     End code excerpt.
37 '\"
38 '\" .VS ?version? ?br?
39 '\"     Begin vertical sidebar, for use in marking newly-changed parts
40 '\"     of man pages.  The first argument is ignored and used for recording
41 '\"     the version when the .VS was added, so that the sidebars can be
42 '\"     found and removed when they reach a certain age.  If another argument
43 '\"     is present, then a line break is forced before starting the sidebar.
44 '\"
45 '\" .VE
46 '\"     End of vertical sidebar.
47 '\"
48 '\" .DS
49 '\"     Begin an indented unfilled display.
50 '\"
51 '\" .DE
52 '\"     End of indented unfilled display.
53 '\"
54 '\" .SO
55 '\"     Start of list of standard options for a Tk widget.  The
56 '\"     options follow on successive lines, in four columns separated
57 '\"     by tabs.
58 '\"
59 '\" .SE
60 '\"     End of list of standard options for a Tk widget.
61 '\"
62 '\" .OP cmdName dbName dbClass
63 '\"     Start of description of a specific option.  cmdName gives the
64 '\"     option's name as specified in the class command, dbName gives
65 '\"     the option's name in the option database, and dbClass gives
66 '\"     the option's class in the option database.
67 '\"
68 '\" .UL arg1 arg2
69 '\"     Print arg1 underlined, then print arg2 normally.
70 '\"
71 '\" RCS: @(#) $Id: man.macros,v 1.3 1999/04/16 00:46:35 stanton Exp $
72 '\"
73 '\"     # Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
74 .if t .wh -1.3i ^B
75 .nr ^l \n(.l
76 .ad b
77 '\"     # Start an argument description
78 .de AP
79 .ie !"\\$4"" .TP \\$4
80 .el \{\
81 .   ie !"\\$2"" .TP \\n()Cu
82 .   el          .TP 15
83 .\}
84 .ta \\n()Au \\n()Bu
85 .ie !"\\$3"" \{\
86 \&\\$1  \\fI\\$2\\fP    (\\$3)
87 .\".b
88 .\}
89 .el \{\
90 .br
91 .ie !"\\$2"" \{\
92 \&\\$1  \\fI\\$2\\fP
93 .\}
94 .el \{\
95 \&\\fI\\$1\\fP
96 .\}
97 .\}
98 ..
99 '\"     # define tabbing values for .AP
100 .de AS
101 .nr )A 10n
102 .if !"\\$1"" .nr )A \\w'\\$1'u+3n
103 .nr )B \\n()Au+15n
104 .\"
105 .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
106 .nr )C \\n()Bu+\\w'(in/out)'u+2n
107 ..
108 .AS Tcl_Interp Tcl_CreateInterp in/out
109 '\"     # BS - start boxed text
110 '\"     # ^y = starting y location
111 '\"     # ^b = 1
112 .de BS
113 .br
114 .mk ^y
115 .nr ^b 1u
116 .if n .nf
117 .if n .ti 0
118 .if n \l'\\n(.lu\(ul'
119 .if n .fi
120 ..
121 '\"     # BE - end boxed text (draw box now)
122 .de BE
123 .nf
124 .ti 0
125 .mk ^t
126 .ie n \l'\\n(^lu\(ul'
127 .el \{\
128 .\"     Draw four-sided box normally, but don't draw top of
129 .\"     box if the box started on an earlier page.
130 .ie !\\n(^b-1 \{\
131 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
132 .\}
133 .el \}\
134 \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
135 .\}
136 .\}
137 .fi
138 .br
139 .nr ^b 0
140 ..
141 '\"     # VS - start vertical sidebar
142 '\"     # ^Y = starting y location
143 '\"     # ^v = 1 (for troff;  for nroff this doesn't matter)
144 .de VS
145 .if !"\\$2"" .br
146 .mk ^Y
147 .ie n 'mc \s12\(br\s0
148 .el .nr ^v 1u
149 ..
150 '\"     # VE - end of vertical sidebar
151 .de VE
152 .ie n 'mc
153 .el \{\
154 .ev 2
155 .nf
156 .ti 0
157 .mk ^t
158 \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
159 .sp -1
160 .fi
161 .ev
162 .\}
163 .nr ^v 0
164 ..
165 '\"     # Special macro to handle page bottom:  finish off current
166 '\"     # box/sidebar if in box/sidebar mode, then invoked standard
167 '\"     # page bottom macro.
168 .de ^B
169 .ev 2
170 'ti 0
171 'nf
172 .mk ^t
173 .if \\n(^b \{\
174 .\"     Draw three-sided box if this is the box's first page,
175 .\"     draw two sides but no top otherwise.
176 .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
177 .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
178 .\}
179 .if \\n(^v \{\
180 .nr ^x \\n(^tu+1v-\\n(^Yu
181 \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
182 .\}
183 .bp
184 'fi
185 .ev
186 .if \\n(^b \{\
187 .mk ^y
188 .nr ^b 2
189 .\}
190 .if \\n(^v \{\
191 .mk ^Y
192 .\}
193 ..
194 '\"     # DS - begin display
195 .de DS
196 .RS
197 .nf
198 .sp
199 ..
200 '\"     # DE - end display
201 .de DE
202 .fi
203 .RE
204 .sp
205 ..
206 '\"     # SO - start of list of standard options
207 .de SO
208 .SH "STANDARD OPTIONS"
209 .LP
210 .nf
211 .ta 4c 8c 12c
212 .ft B
213 ..
214 '\"     # SE - end of list of standard options
215 .de SE
216 .fi
217 .ft R
218 .LP
219 See the \\fBoptions\\fR manual entry for details on the standard options.
220 ..
221 '\"     # OP - start of full description for a single option
222 .de OP
223 .LP
224 .nf
225 .ta 4c
226 Command-Line Name:      \\fB\\$1\\fR
227 Database Name:  \\fB\\$2\\fR
228 Database Class: \\fB\\$3\\fR
229 .fi
230 .IP
231 ..
232 '\"     # CS - begin code excerpt
233 .de CS
234 .RS
235 .nf
236 .ta .25i .5i .75i 1i
237 ..
238 '\"     # CE - end code excerpt
239 .de CE
240 .fi
241 .RE
242 ..
243 .de UL
244 \\$1\l'|0\(ul'\\$2
245 ..
246 .TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
247 .BS
248 .SH NAME
249 Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize \- Tcl thread support.
250 .SH SYNOPSIS
251 .nf
252 \fB#include <tcl.h>\fR
253 .sp
254 void
255 \fBTcl_ConditionNotify\fR(\fIcondPtr\fR)
256 .sp
257 void
258 \fBTcl_ConditionWait\fR(\fIcondPtr, mutexPtr, timePtr\fR)
259 .sp
260 void
261 \fBTcl_ConditionFinalize\fR(\fIcondPtr\fR)
262 .sp
263 Void *
264 \fBTcl_GetThreadData\fR(\fIkeyPtr, size\fR)
265 .sp
266 void
267 \fBTcl_MutexLock\fR(\fImutexPtr\fR)
268 .sp
269 void
270 \fBTcl_MutexUnlock\fR(\fImutexPtr\fR)
271 .sp
272 void
273 \fBTcl_MutexFinalize\fR(\fImutexPtr\fR)
274 .sp
275 int
276 \fBTcl_CreateThread\fR(\fIidPtr, threadProc, clientData, stackSize, flags\fR)
277 .SH ARGUMENTS
278 .AS Tcl_ThreadDataKey *keyPtr
279 .AP Tcl_Condition *condPtr in
280 A condition variable, which must be associated with a mutex lock.
281 .AP Tcl_Condition *mutexPtr in
282 A mutex lock.
283 .AP Tcl_Time *timePtr in
284 A time limit on the condition wait.  NULL to wait forever.
285 Note that a polling value of 0 seconds doesn't make much sense.
286 .AP Tcl_ThreadDataKey *keyPtr in
287 This identifies a block of thread local storage.  The key should be
288 static and process-wide, yet each thread will end up associating
289 a different block of storage with this key.
290 .AP int *size in
291 The size of the thread local storage block.  This amount of data
292 is allocated and initialized to zero the first time each thread
293 calls \fBTcl_GetThreadData\fR.
294 .AP Tcl_ThreadId *idPtr out
295 The refered storage will contain the id of the newly created thread as
296 returned by the operating system.
297 .AP Tcl_ThreadCreateProc threadProc in
298 This procedure will act as the \fBmain()\fR of the newly created
299 thread. The specified \fIclientData\fR will be its sole argument.
300 .AP ClientData clientData in
301 Arbitrary information. Passed as sole argument to the \fIthreadProc\fR.
302 .AP int stackSize in
303 The size of the stack given to the new thread.
304 .AP int flags in
305 Bitmask containing flags allowing the caller to modify behaviour of
306 the new thread.
307 .BE
308 .SH INTRODUCTION
309 Beginning with the 8.1 release, the Tcl core is thread safe, which
310 allows you to incorporate Tcl into multithreaded applications without
311 customizing the Tcl core.  To enable Tcl multithreading support,
312 you must include the \fB--enable-threads\fR option to \fBconfigure\fR
313 when you configure and compile your Tcl core.
314 .PP
315 An important contstraint of the Tcl threads implementation is that
316 \fIonly the thread that created a Tcl interpreter can use that
317 interpreter\fR.  In other words, multiple threads can not access
318 the same Tcl interpreter.  (However, as was the case in previous
319 releases, a single thread can safely create and use multiple
320 interpreters.)
321 .PP
322 .VS 8.3.1
323 Tcl does provide \fBTcl_CreateThread\fR for creating threads. The
324 caller can determine the size of the stack given to the new thread and
325 modify the behaviour through the supplied \fIflags\fR. The value
326 \fBTCL_THREAD_STACK_DEFAULT\fR for the \fIstackSize\fR indicates that
327 the default size as specified by the operating system is to be used
328 for the new thread. As for the flags, currently are only the values
329 \fBTCL_THREAD_NOFLAGS\fR and \fBTCL_THREAD_JOINABLE\fR defined. The
330 first of them invokes the default behaviour with no
331 specialities. Using the second value marks the new thread as
332 \fIjoinable\fR. This means that another thread can wait for the such
333 marked thread to exit and join it.
334 .PP
335 Restrictions: On some unix systems the pthread-library does not
336 contain the functionality to specify the stacksize of a thread. The
337 specified value for the stacksize is ignored on these systems. Both
338 Windows and Macintosh currently do not support joinable threads. This
339 flag value is therefore ignored on these platforms.
340 .VE
341 .PP
342 Tcl does provide \fBTcl_ExitThread\fR and \fBTcl_FinalizeThread\fR
343 for terminating threads and invoking optional per-thread exit
344 handlers.  See the \fBTcl_Exit\fR page for more information on these
345 procedures.
346 .PP
347 Tcl provides \fBTcl_ThreadQueueEvent\fR and \fBTcl_ThreadAlert\fR
348 for handling event queueing in multithreaded applications.  See
349 the \fBNotifier\fR manual page for more information on these procedures.
350 .PP
351 In this release, the Tcl language itself provides no support for
352 creating multithreaded scripts (for example, scripts that could spawn
353 a Tcl interpreter in a separate thread).  If you need to add this
354 feature at this time, see the \fItclThreadTest.c\fR
355 file in the Tcl source distribution for an experimental implementation
356 of a Tcl "Thread" package implementing thread creation and management
357 commands at the script level.
358
359 .SH DESCRIPTION
360 A mutex is a lock that is used to serialize all threads through a piece
361 of code by calling \fBTcl_MutexLock\fR and \fBTcl_MutexUnlock\fR.
362 If one thread holds a mutex, any other thread calling \fBTcl_MutexLock\fR will
363 block until \fBTcl_MutexUnlock\fR is called.
364 .VS
365 A mutex can be destroyed after its use by calling \fBTcl_MutexFinalize\fR.
366 The result of locking a mutex twice from the same thread is undefined.
367 On some platforms it will result in a deadlock.
368 .VE
369 The \fBTcl_MutexLock\fR, \fBTcl_MutexUnlock\fR and \fBTcl_MutexFinalize\fR
370 procedures are defined as empty macros if not compiling with threads enabled.
371 .PP
372 A condition variable is used as a signaling mechanism:
373 a thread can lock a mutex and then wait on a condition variable
374 with \fBTcl_ConditionWait\fR.  This atomically releases the mutex lock
375 and blocks the waiting thread until another thread calls
376 \fBTcl_ConditionNotify\fR.  The caller of \fBTcl_ConditionNotify\fR should
377 have the associated mutex held by previously calling \fBTcl_MutexLock\fR,
378 but this is not enforced.  Notifying the
379 condition variable unblocks all threads waiting on the condition variable,
380 but they do not proceed until the mutex is released with \fBTcl_MutexUnlock\fR.
381 The implementation of \fBTcl_ConditionWait\fR automatically locks
382 the mutex before returning.
383 .PP
384 The caller of \fBTcl_ConditionWait\fR should be prepared for spurious
385 notifications by calling \fBTcl_ConditionWait\fR within a while loop
386 that tests some invariant.
387 .PP
388 .VS
389 A condition variable can be destroyed after its use by calling
390 \fBTcl_ConditionFinalize\fR.
391 .PP
392 The \fBTcl_ConditionNotify\fR, \fBTcl_ConditionWait\fR and
393 \fBTcl_ConditionFinalize\fR procedures are defined as empty macros if
394 not compiling with threads enabled.
395 .VE
396 .PP
397 The \fBTcl_GetThreadData\fR call returns a pointer to a block of
398 thread-private data.  Its argument is a key that is shared by all threads
399 and a size for the block of storage.  The storage is automatically 
400 allocated and initialized to all zeros the first time each thread asks for it.
401 The storage is automatically deallocated by \fBTcl_FinalizeThread\fR.
402 .SH INITIALIZATION
403 .PP
404 All of these synchronization objects are self initializing.
405 They are implemented as opaque pointers that should be NULL
406 upon first use.
407 The mutexes and condition variables are
408 .VS
409 either cleaned up by process exit handlers (if living that long) or
410 explicitly by calls to \fBTcl_MutexFinalize\fR or
411 \fBTcl_ConditionFinalize\fR.
412 .VE
413 Thread local storage is reclaimed during \fBTcl_FinalizeThread\fR.
414 .SH "CREATING THREADS"
415 The API to create threads is not finalized at this time.
416 There are private facilities to create threads that contain a new
417 Tcl interpreter, and to send scripts among threads.
418 Dive into tclThreadTest.c and tclThread.c for examples.
419 .SH "SEE ALSO"
420 Tcl_GetCurrentThread, Tcl_ThreadQueueEvent, Tcl_ThreadAlert,
421 Tcl_ExitThread, Tcl_FinalizeThread,
422 Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler
423 .SH KEYWORDS
424 thread, mutex, condition variable, thread local storage