Thread.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  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.14.2.2 2004/11/25 15:48:52 vasiljevic Exp $
  9. '" 
  10. .so man.macros
  11. .TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
  12. .BS
  13. .SH NAME
  14. Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread, Tcl_JoinThread - Tcl thread support.
  15. .SH SYNOPSIS
  16. .nf
  17. fB#include <tcl.h>fR
  18. .sp
  19. void
  20. fBTcl_ConditionNotifyfR(fIcondPtrfR)
  21. .sp
  22. void
  23. fBTcl_ConditionWaitfR(fIcondPtr, mutexPtr, timePtrfR)
  24. .sp
  25. void
  26. fBTcl_ConditionFinalizefR(fIcondPtrfR)
  27. .sp
  28. Void *
  29. fBTcl_GetThreadDatafR(fIkeyPtr, sizefR)
  30. .sp
  31. void
  32. fBTcl_MutexLockfR(fImutexPtrfR)
  33. .sp
  34. void
  35. fBTcl_MutexUnlockfR(fImutexPtrfR)
  36. .sp
  37. void
  38. fBTcl_MutexFinalizefR(fImutexPtrfR)
  39. .sp
  40. int
  41. fBTcl_CreateThreadfR(fIidPtr, threadProc, clientData, stackSize, flagsfR)
  42. .sp
  43. int
  44. fBTcl_JoinThreadfR(fIid, resultfR)
  45. .SH ARGUMENTS
  46. .AS Tcl_ThreadDataKey *keyPtr
  47. .AP Tcl_Condition *condPtr in
  48. A condition variable, which must be associated with a mutex lock.
  49. .AP Tcl_Mutex *mutexPtr in
  50. A mutex lock.
  51. .AP Tcl_Time *timePtr in
  52. A time limit on the condition wait.  NULL to wait forever.
  53. Note that a polling value of 0 seconds doesn't make much sense.
  54. .AP Tcl_ThreadDataKey *keyPtr in
  55. This identifies a block of thread local storage.  The key should be
  56. static and process-wide, yet each thread will end up associating
  57. a different block of storage with this key.
  58. .AP int *size in
  59. The size of the thread local storage block.  This amount of data
  60. is allocated and initialized to zero the first time each thread
  61. calls fBTcl_GetThreadDatafR.
  62. .AP Tcl_ThreadId *idPtr out
  63. The referred storage will contain the id of the newly created thread as
  64. returned by the operating system.
  65. .AP Tcl_ThreadId id in
  66. Id of the thread waited upon.
  67. .AP Tcl_ThreadCreateProc threadProc in
  68. This procedure will act as the fBmain()fR of the newly created
  69. thread. The specified fIclientDatafR will be its sole argument.
  70. .AP ClientData clientData in
  71. Arbitrary information. Passed as sole argument to the fIthreadProcfR.
  72. .AP int stackSize in
  73. The size of the stack given to the new thread.
  74. .AP int flags in
  75. Bitmask containing flags allowing the caller to modify behaviour of
  76. the new thread.
  77. .AP int *result out
  78. The referred storage is used to place the exit code of the thread
  79. waited upon into it.
  80. .BE
  81. .SH INTRODUCTION
  82. Beginning with the 8.1 release, the Tcl core is thread safe, which
  83. allows you to incorporate Tcl into multithreaded applications without
  84. customizing the Tcl core.  To enable Tcl multithreading support,
  85. you must include the fB--enable-threadsfR option to fBconfigurefR
  86. when you configure and compile your Tcl core.
  87. .PP
  88. An important constraint of the Tcl threads implementation is that
  89. fIonly the thread that created a Tcl interpreter can use that
  90. interpreterfR.  In other words, multiple threads can not access
  91. the same Tcl interpreter.  (However, as was the case in previous
  92. releases, a single thread can safely create and use multiple
  93. interpreters.)
  94. .PP
  95. .VS 8.3.1
  96. Tcl does provide fBTcl_CreateThreadfR for creating threads. The
  97. caller can determine the size of the stack given to the new thread and
  98. modify the behaviour through the supplied fIflagsfR. The value
  99. fBTCL_THREAD_STACK_DEFAULTfR for the fIstackSizefR indicates that
  100. the default size as specified by the operating system is to be used
  101. for the new thread. As for the flags, currently are only the values
  102. fBTCL_THREAD_NOFLAGSfR and fBTCL_THREAD_JOINABLEfR defined. The
  103. first of them invokes the default behaviour with no
  104. specialties. Using the second value marks the new thread as
  105. fIjoinablefR. This means that another thread can wait for the such
  106. marked thread to exit and join it.
  107. .PP
  108. Restrictions: On some unix systems the pthread-library does not
  109. contain the functionality to specify the stacksize of a thread. The
  110. specified value for the stacksize is ignored on these systems. Both
  111. Windows and Macintosh currently do not support joinable threads. This
  112. flag value is therefore ignored on these platforms.
  113. .VE
  114. .PP
  115. Tcl does provide fBTcl_ExitThreadfR and fBTcl_FinalizeThreadfR
  116. for terminating threads and invoking optional per-thread exit
  117. handlers.  See the fBTcl_ExitfR page for more information on these
  118. procedures.
  119. .PP
  120. .VS
  121. The fBTcl_JoinThreadfR function is provided to allow threads to wait
  122. upon the exit of another thread, which must have been marked as
  123. joinable through usage of the fBTCL_THREAD_JOINABLEfR-flag during
  124. its creation via fBTcl_CreateThreadfR.
  125. .PP
  126. Trying to wait for the exit of a non-joinable thread or a thread which
  127. is already waited upon will result in an error. Waiting for a joinable
  128. thread which already exited is possible, the system will retain the
  129. necessary information until after the call to fBTcl_JoinThreadfR.
  130. This means that not calling fBTcl_JoinThreadfR for a joinable thread
  131. will cause a memory leak.
  132. .VE
  133. .PP
  134. Tcl provides fBTcl_ThreadQueueEventfR and fBTcl_ThreadAlertfR
  135. for handling event queueing in multithreaded applications.  See
  136. the fBNotifierfR manual page for more information on these procedures.
  137. .PP
  138. In this release, the Tcl language itself provides no support for
  139. creating multithreaded scripts (for example, scripts that could spawn
  140. a Tcl interpreter in a separate thread).  If you need to add this
  141. feature at this time, see the fItclThreadTest.cfR
  142. file in the Tcl source distribution for an experimental implementation
  143. or use the Tcl "Threading Extension" package implementing thread creation
  144. and management commands at the script level.
  145. .SH DESCRIPTION
  146. A mutex is a lock that is used to serialize all threads through a piece
  147. of code by calling fBTcl_MutexLockfR and fBTcl_MutexUnlockfR.
  148. If one thread holds a mutex, any other thread calling fBTcl_MutexLockfR will
  149. block until fBTcl_MutexUnlockfR is called.
  150. .VS
  151. A mutex can be destroyed after its use by calling fBTcl_MutexFinalizefR.
  152. The result of locking a mutex twice from the same thread is undefined.
  153. On some platforms it will result in a deadlock.
  154. .VE
  155. The fBTcl_MutexLockfR, fBTcl_MutexUnlockfR and fBTcl_MutexFinalizefR
  156. procedures are defined as empty macros if not compiling with threads enabled.
  157. For declaration of mutexes the fBTCL_DECLARE_MUTEXfR macro should be used.
  158. This macro assures correct mutex handling even when the core is compiled
  159. without threads enabled. 
  160. .PP
  161. A condition variable is used as a signaling mechanism:
  162. a thread can lock a mutex and then wait on a condition variable
  163. with fBTcl_ConditionWaitfR.  This atomically releases the mutex lock
  164. and blocks the waiting thread until another thread calls
  165. fBTcl_ConditionNotifyfR.  The caller of fBTcl_ConditionNotifyfR should
  166. have the associated mutex held by previously calling fBTcl_MutexLockfR,
  167. but this is not enforced.  Notifying the
  168. condition variable unblocks all threads waiting on the condition variable,
  169. but they do not proceed until the mutex is released with fBTcl_MutexUnlockfR.
  170. The implementation of fBTcl_ConditionWaitfR automatically locks
  171. the mutex before returning.
  172. .PP
  173. The caller of fBTcl_ConditionWaitfR should be prepared for spurious
  174. notifications by calling fBTcl_ConditionWaitfR within a while loop
  175. that tests some invariant.
  176. .PP
  177. .VS
  178. A condition variable can be destroyed after its use by calling
  179. fBTcl_ConditionFinalizefR.
  180. .PP
  181. The fBTcl_ConditionNotifyfR, fBTcl_ConditionWaitfR and
  182. fBTcl_ConditionFinalizefR procedures are defined as empty macros if
  183. not compiling with threads enabled.
  184. .VE
  185. .PP
  186. The fBTcl_GetThreadDatafR call returns a pointer to a block of
  187. thread-private data.  Its argument is a key that is shared by all threads
  188. and a size for the block of storage.  The storage is automatically 
  189. allocated and initialized to all zeros the first time each thread asks for it.
  190. The storage is automatically deallocated by fBTcl_FinalizeThreadfR.
  191. .SH INITIALIZATION
  192. .PP
  193. All of these synchronization objects are self initializing.
  194. They are implemented as opaque pointers that should be NULL
  195. upon first use.
  196. The mutexes and condition variables are
  197. .VS
  198. either cleaned up by process exit handlers (if living that long) or
  199. explicitly by calls to fBTcl_MutexFinalizefR or
  200. fBTcl_ConditionFinalizefR.
  201. .VE
  202. Thread local storage is reclaimed during fBTcl_FinalizeThreadfR.
  203. .SH "CREATING THREADS"
  204. The API to create threads is not finalized at this time.
  205. There are private facilities to create threads that contain a new
  206. Tcl interpreter, and to send scripts among threads.
  207. Dive into tclThreadTest.c and tclThread.c for examples.
  208. .SH "SEE ALSO"
  209. Tcl_GetCurrentThread, Tcl_ThreadQueueEvent, Tcl_ThreadAlert,
  210. Tcl_ExitThread, Tcl_FinalizeThread,
  211. Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler
  212. .SH KEYWORDS
  213. thread, mutex, condition variable, thread local storage