⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;cybergene&nbsp;(基因~也许以后~~),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;Tcl&nbsp;Threading&nbsp;Model&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Dec&nbsp;14&nbsp;15:59:19&nbsp;2000)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Tcl&nbsp;Threading&nbsp;Model&nbsp;<BR>&nbsp;&nbsp;<BR>TclPro&nbsp;Extensions&nbsp;|&nbsp;Wrap&nbsp;TclPro&nbsp;|&nbsp;Compile&nbsp;Tcl&nbsp;|&nbsp;Stub&nbsp;Libraries&nbsp;|&nbsp;Threads&nbsp;<BR>&nbsp;|&nbsp;Windows&nbsp;Extensions&nbsp;|&nbsp;Regular&nbsp;Expressions&nbsp;|&nbsp;I18N&nbsp;&nbsp;<BR>&nbsp;<BR>This&nbsp;page&nbsp;describes&nbsp;the&nbsp;model&nbsp;Tcl&nbsp;uses&nbsp;for&nbsp;multi-threading,&nbsp;and&nbsp;it&nbsp;gives&nbsp;<BR>&nbsp;an&nbsp;overview&nbsp;of&nbsp;the&nbsp;APIs&nbsp;available&nbsp;at&nbsp;the&nbsp;Tcl&nbsp;and&nbsp;C&nbsp;level.&nbsp;The&nbsp;Thread&nbsp;&nbsp;<BR>Extension&nbsp;exposes&nbsp;the&nbsp;threading&nbsp;facilities&nbsp;described&nbsp;here&nbsp;to&nbsp;the&nbsp;Tcl&nbsp;&nbsp;<BR>script&nbsp;level.&nbsp;&nbsp;<BR>One&nbsp;Thread&nbsp;Per&nbsp;Interpreter&nbsp;<BR>Tcl&nbsp;lets&nbsp;you&nbsp;have&nbsp;one&nbsp;or&nbsp;more&nbsp;Tcl&nbsp;interpreters&nbsp;(e.g.,&nbsp;created&nbsp;with&nbsp;&nbsp;<BR>Tcl_CreateInterp())&nbsp;in&nbsp;each&nbsp;operating&nbsp;system&nbsp;thread.&nbsp;However,&nbsp;each&nbsp;&nbsp;<BR>interpreter&nbsp;is&nbsp;tightly&nbsp;bound&nbsp;to&nbsp;its&nbsp;OS&nbsp;thread&nbsp;and&nbsp;errors&nbsp;will&nbsp;occur&nbsp;if&nbsp;&nbsp;<BR>you&nbsp;let&nbsp;more&nbsp;than&nbsp;one&nbsp;thread&nbsp;call&nbsp;into&nbsp;the&nbsp;same&nbsp;interpreter&nbsp;(e.g.,&nbsp;&nbsp;<BR>with&nbsp;Tcl_Eval).&nbsp;&nbsp;<BR>Communication&nbsp;Among&nbsp;Threads&nbsp;<BR>Tcl&nbsp;scripts&nbsp;in&nbsp;different&nbsp;threads&nbsp;can&nbsp;communicate&nbsp;by&nbsp;posting&nbsp;scripts&nbsp;onto&nbsp;<BR>&nbsp;the&nbsp;event&nbsp;queue&nbsp;of&nbsp;an&nbsp;interpreter&nbsp;in&nbsp;a&nbsp;different&nbsp;thread.&nbsp;This&nbsp;can&nbsp;be&nbsp;&nbsp;<BR>synchronous,&nbsp;where&nbsp;you&nbsp;wait&nbsp;for&nbsp;the&nbsp;result,&nbsp;or&nbsp;asynchronous,&nbsp;where&nbsp;&nbsp;<BR>your&nbsp;thread&nbsp;does&nbsp;not&nbsp;wait&nbsp;for&nbsp;the&nbsp;other&nbsp;thread&nbsp;to&nbsp;evaluate&nbsp;its&nbsp;script.&nbsp;&nbsp;<BR>The&nbsp;2.1&nbsp;version&nbsp;of&nbsp;the&nbsp;Thread&nbsp;Extension&nbsp;provides&nbsp;shared&nbsp;variables,&nbsp;&nbsp;<BR>mutexes,&nbsp;and&nbsp;condition&nbsp;variables&nbsp;so&nbsp;you&nbsp;can&nbsp;enjoy&nbsp;all&nbsp;the&nbsp;benefits,&nbsp;&nbsp;<BR>perils,&nbsp;and&nbsp;pitfalls&nbsp;of&nbsp;threaded&nbsp;programming.&nbsp;Also,&nbsp;if&nbsp;you&nbsp;use&nbsp;this&nbsp;&nbsp;<BR>extension&nbsp;with&nbsp;the&nbsp;new&nbsp;8.4&nbsp;releases&nbsp;you&nbsp;can&nbsp;transfer&nbsp;I/O&nbsp;channels&nbsp;&nbsp;<BR>between&nbsp;threads.&nbsp;&nbsp;<BR>&nbsp;<BR>The&nbsp;Thread&nbsp;Package&nbsp;<BR>By&nbsp;default,&nbsp;Tcl&nbsp;is&nbsp;still&nbsp;compiled&nbsp;without&nbsp;thread&nbsp;support&nbsp;and&nbsp;without&nbsp;&nbsp;<BR>script-level&nbsp;access&nbsp;to&nbsp;threads.&nbsp;To&nbsp;use&nbsp;threads&nbsp;you&nbsp;need&nbsp;to&nbsp;can&nbsp;use&nbsp;the&nbsp;&nbsp;<BR>testthread&nbsp;command&nbsp;that&nbsp;was&nbsp;added&nbsp;to&nbsp;tcltest&nbsp;for&nbsp;the&nbsp;Tcl&nbsp;8.1&nbsp;test&nbsp;suite.&nbsp;<BR>&nbsp;This&nbsp;was&nbsp;turned&nbsp;into&nbsp;its&nbsp;own&nbsp;extension,&nbsp;Thread,&nbsp;in&nbsp;conjunction&nbsp;with&nbsp;the&nbsp;<BR>&nbsp;Tcl&nbsp;8.3.1&nbsp;release.&nbsp;There&nbsp;is&nbsp;also&nbsp;a&nbsp;mkThread&nbsp;extension&nbsp;created&nbsp;by&nbsp;&nbsp;<BR>Michael&nbsp;Kraus.&nbsp;So,&nbsp;now&nbsp;you&nbsp;can&nbsp;just&nbsp;build&nbsp;Tcl&nbsp;8.3&nbsp;(or&nbsp;8.4)&nbsp;with&nbsp;&nbsp;<BR>threads&nbsp;enabled&nbsp;and&nbsp;load&nbsp;the&nbsp;thread&nbsp;extension.&nbsp;&nbsp;<BR>The&nbsp;Thread&nbsp;2.1&nbsp;manual&nbsp;page.&nbsp;&nbsp;<BR>&nbsp;<BR>The&nbsp;C&nbsp;API&nbsp;<BR>If&nbsp;you&nbsp;maintain&nbsp;an&nbsp;extension,&nbsp;you'll&nbsp;need&nbsp;to&nbsp;use&nbsp;the&nbsp;C&nbsp;APIs&nbsp;to&nbsp;make&nbsp;your&nbsp;<BR>&nbsp;extension&nbsp;thread&nbsp;safe.&nbsp;Tcl&nbsp;provides&nbsp;mutex&nbsp;locks,&nbsp;condition&nbsp;variables&nbsp;&nbsp;<BR>for&nbsp;synchronization,&nbsp;and&nbsp;thread-local&nbsp;storage&nbsp;to&nbsp;help&nbsp;manage&nbsp;data&nbsp;&nbsp;<BR>structures.&nbsp;&nbsp;<BR>If&nbsp;you&nbsp;are&nbsp;making&nbsp;old&nbsp;code&nbsp;thread&nbsp;safe,&nbsp;then&nbsp;you&nbsp;can&nbsp;focus&nbsp;your&nbsp;&nbsp;<BR>attention&nbsp;on&nbsp;the&nbsp;global&nbsp;data&nbsp;structures.&nbsp;You'll&nbsp;either&nbsp;need&nbsp;to&nbsp;serialize&nbsp;<BR>&nbsp;all&nbsp;thread&nbsp;access&nbsp;by&nbsp;putting&nbsp;a&nbsp;Tcl_MutexLock&nbsp;and&nbsp;Tcl_MutexUnlock&nbsp;call&nbsp;&nbsp;<BR>around&nbsp;all&nbsp;accesses&nbsp;to&nbsp;the&nbsp;variable,&nbsp;or&nbsp;you&nbsp;may&nbsp;be&nbsp;able&nbsp;to&nbsp;move&nbsp;the&nbsp;data&nbsp;<BR>&nbsp;structure&nbsp;into&nbsp;&quot;thread&nbsp;local&nbsp;storage&quot;.&nbsp;&nbsp;<BR>&nbsp;<BR>A&nbsp;great&nbsp;source&nbsp;of&nbsp;examples&nbsp;is&nbsp;the&nbsp;Tcl&nbsp;and&nbsp;Tk&nbsp;source&nbsp;code&nbsp;itself.&nbsp;The&nbsp;&nbsp;<BR>following&nbsp;are&nbsp;examples&nbsp;taken&nbsp;from&nbsp;the&nbsp;sources.&nbsp;&nbsp;<BR>&nbsp;<BR>Mutex&nbsp;Variable&nbsp;Example&nbsp;&nbsp;<BR>The&nbsp;tclEvent.c&nbsp;file&nbsp;maintains&nbsp;a&nbsp;global&nbsp;list&nbsp;of&nbsp;exit&nbsp;handlers.&nbsp;Access&nbsp;&nbsp;<BR>to&nbsp;this&nbsp;list&nbsp;is&nbsp;serialized&nbsp;with&nbsp;a&nbsp;mutex&nbsp;lock.&nbsp;The&nbsp;TCL_DECLARE_MUTEX&nbsp;&nbsp;<BR>macro&nbsp;declares&nbsp;a&nbsp;mutex&nbsp;variable&nbsp;if&nbsp;threading&nbsp;is&nbsp;enabled,&nbsp;otherwise&nbsp;it&nbsp;&nbsp;<BR>does&nbsp;nothing.&nbsp;&nbsp;<BR>static&nbsp;ExitHandler&nbsp;*firstExitPtr&nbsp;=&nbsp;NULL;&nbsp;<BR>TCL_DECLARE_MUTEX(exitMutex)&nbsp;<BR>&nbsp;<BR>Later,&nbsp;in&nbsp;the&nbsp;code&nbsp;that&nbsp;references&nbsp;firstExitPtr:&nbsp;&nbsp;<BR>&nbsp;<BR>Tcl_MutexLock(&amp;exitMutex);&nbsp;<BR>exitPtr-&gt;nextPtr&nbsp;=&nbsp;firstExitPtr;&nbsp;<BR>firstExitPtr&nbsp;=&nbsp;exitPtr;&nbsp;<BR>Tcl_MutexUnlock(&amp;exitMutex);&nbsp;<BR>&nbsp;<BR>The&nbsp;Tcl_MutexLock&nbsp;and&nbsp;Tcl_MutexUnlock&nbsp;calls&nbsp;are&nbsp;also&nbsp;macros&nbsp;that&nbsp;&nbsp;<BR>expand&nbsp;into&nbsp;nothing&nbsp;unless&nbsp;you&nbsp;configure&nbsp;with&nbsp;--enable-threads.&nbsp;&nbsp;<BR>Thread&nbsp;Local&nbsp;Storage&nbsp;/&nbsp;ThreadSpecificData&nbsp;<BR>In&nbsp;many&nbsp;cases&nbsp;it&nbsp;is&nbsp;possible&nbsp;to&nbsp;have&nbsp;storage&nbsp;that&nbsp;is&nbsp;private&nbsp;to&nbsp;a&nbsp;thread&nbsp;<BR>&nbsp;instead&nbsp;of&nbsp;shared&nbsp;among&nbsp;threads.&nbsp;Access&nbsp;to&nbsp;this&nbsp;is&nbsp;cheaper&nbsp;because&nbsp;&nbsp;<BR>you&nbsp;do&nbsp;not&nbsp;need&nbsp;to&nbsp;synchronize.&nbsp;For&nbsp;example,&nbsp;Tcl&nbsp;keeps&nbsp;a&nbsp;list&nbsp;of&nbsp;I/O&nbsp;&nbsp;<BR>channels&nbsp;that&nbsp;are&nbsp;opened&nbsp;by&nbsp;a&nbsp;particular&nbsp;thread.&nbsp;As&nbsp;there&nbsp;is&nbsp;no&nbsp;&nbsp;<BR>sharing&nbsp;among&nbsp;interpreters&nbsp;in&nbsp;different&nbsp;threads,&nbsp;this&nbsp;information&nbsp;can&nbsp;be&nbsp;<BR>&nbsp;managed&nbsp;by&nbsp;each&nbsp;thread&nbsp;independently.&nbsp;&nbsp;<BR>If&nbsp;you&nbsp;look&nbsp;in&nbsp;the&nbsp;Tcl&nbsp;sources&nbsp;for&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>typedef&nbsp;struct&nbsp;ThreadSpecificData&nbsp;<BR>&nbsp;<BR>you&nbsp;will&nbsp;find&nbsp;several&nbsp;examples.&nbsp;These&nbsp;are&nbsp;per-file&nbsp;declarations&nbsp;of&nbsp;the&nbsp;&nbsp;<BR>thread-local&nbsp;variables&nbsp;used&nbsp;in&nbsp;that&nbsp;file.&nbsp;For&nbsp;example,&nbsp;in&nbsp;tclIO.c,&nbsp;&nbsp;<BR>&nbsp;<BR>typedef&nbsp;struct&nbsp;ThreadSpecificData&nbsp;{&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;variable&nbsp;holds&nbsp;the&nbsp;list&nbsp;of&nbsp;nested&nbsp;ChannelHandlerEventProc&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;invocations.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;NextChannelHandler&nbsp;*nestedHandlerPtr;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;List&nbsp;of&nbsp;all&nbsp;channels&nbsp;currently&nbsp;open.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Channel&nbsp;*firstChanPtr;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Static&nbsp;variables&nbsp;to&nbsp;hold&nbsp;channels&nbsp;for&nbsp;stdin,&nbsp;stdout&nbsp;and&nbsp;stderr.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Tcl_Channel&nbsp;stdinChannel;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;stdinInitialized;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Tcl_Channel&nbsp;stdoutChannel;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;stdoutInitialized;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Tcl_Channel&nbsp;stderrChannel;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;stderrInitialized;&nbsp;<BR>&nbsp;&nbsp;<BR>}&nbsp;ThreadSpecificData;&nbsp;<BR>&nbsp;&nbsp;<BR>static&nbsp;Tcl_ThreadDataKey&nbsp;dataKey;&nbsp;<BR>&nbsp;<BR>Each&nbsp;block&nbsp;of&nbsp;thread&nbsp;specific&nbsp;data&nbsp;is&nbsp;associated&nbsp;with&nbsp;a&nbsp;thread&nbsp;&quot;data&nbsp;&nbsp;<BR>key&quot;,&nbsp;which&nbsp;is&nbsp;an&nbsp;identifier&nbsp;for&nbsp;this&nbsp;particular&nbsp;block&nbsp;of&nbsp;thread&nbsp;&nbsp;<BR>specific&nbsp;data.&nbsp;Each&nbsp;thread&nbsp;will&nbsp;use&nbsp;the&nbsp;same&nbsp;identifier&nbsp;to&nbsp;get&nbsp;its&nbsp;own&nbsp;&nbsp;<BR>private&nbsp;copy&nbsp;of&nbsp;those&nbsp;variables.&nbsp;It&nbsp;works&nbsp;like&nbsp;this&nbsp;(e.g.,&nbsp;in&nbsp;&nbsp;<BR>TclFinalizeIOSubsystem):&nbsp;&nbsp;<BR>&nbsp;<BR>void&nbsp;<BR>TclFinalizeIOSubsystem()&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ThreadSpecificData&nbsp;*tsdPtr&nbsp;=&nbsp;TCL_TSD_INIT(&amp;dataKey);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Channel&nbsp;*chanPtr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Iterates&nbsp;over&nbsp;open&nbsp;channels.&nbsp;<BR>&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Channel&nbsp;*nextChanPtr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Iterates&nbsp;over&nbsp;open&nbsp;channels.&nbsp;<BR>&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(chanPtr&nbsp;=&nbsp;tsdPtr-&gt;firstChanPtr;&nbsp;chanPtr&nbsp;!=&nbsp;(Channel&nbsp;*)&nbsp;NULL;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chanPtr&nbsp;=&nbsp;nextChanPtr)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextChanPtr&nbsp;=&nbsp;chanPtr-&gt;nextChanPtr;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;code&nbsp;omitted&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>Condition&nbsp;Variables&nbsp;&nbsp;<BR>Condition&nbsp;variables&nbsp;are&nbsp;associated&nbsp;with&nbsp;a&nbsp;Mutex&nbsp;lock.&nbsp;The&nbsp;mutex&nbsp;is&nbsp;&nbsp;<BR>automatically&nbsp;released&nbsp;when&nbsp;you&nbsp;wait&nbsp;on&nbsp;a&nbsp;condition&nbsp;variable,&nbsp;and&nbsp;the&nbsp;&nbsp;<BR>mutex&nbsp;is&nbsp;automatically&nbsp;aquired&nbsp;when&nbsp;you&nbsp;unblock&nbsp;from&nbsp;waiting.&nbsp;The&nbsp;&nbsp;<BR>typical&nbsp;patterns&nbsp;of&nbsp;use&nbsp;are:&nbsp;&nbsp;<BR>&nbsp;<BR>Tcl_MutexLock(&amp;myMutex);&nbsp;<BR>&nbsp;<BR>while&nbsp;(condition_is_false)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tcl_ConditionWait(&amp;myConditionVariable,&nbsp;&amp;myMutex,&nbsp;NULL&nbsp;/*&nbsp;no&nbsp;&nbsp;<BR>timeout&nbsp;*/);&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>Tcl_MutexUnlock(&amp;myMutex);&nbsp;<BR>&nbsp;<BR>and&nbsp;&nbsp;<BR>&nbsp;<BR>Tcl_MutexLock(&amp;myMutex);&nbsp;<BR>/*&nbsp;set&nbsp;shared&nbsp;state&nbsp;*/&nbsp;<BR>Tcl_ConditionNotify(&amp;myConditionVariable);&nbsp;<BR>Tcl_MutexUnlock(&amp;myMutex);&nbsp;<BR>&nbsp;<BR>Thread&nbsp;C&nbsp;API&nbsp;documentation&nbsp;&nbsp;<BR>&nbsp;<BR>Allocation&nbsp;and&nbsp;Cleanup&nbsp;Issues&nbsp;&nbsp;<BR>The&nbsp;Mutex,&nbsp;Condition&nbsp;Variable,&nbsp;and&nbsp;Thread&nbsp;Local&nbsp;Storage&nbsp;structures&nbsp;in&nbsp;&nbsp;<BR>Tcl&nbsp;are&nbsp;&quot;self-initializing&quot;.&nbsp;For&nbsp;example,&nbsp;there&nbsp;is&nbsp;Tcl_MutexLock&nbsp;and&nbsp;&nbsp;<BR>Tcl_MutexUnlock,&nbsp;but&nbsp;no&nbsp;Tcl_MutexInit.&nbsp;Similarly,&nbsp;the&nbsp;first&nbsp;time&nbsp;a&nbsp;&nbsp;<BR>thread&nbsp;fetches&nbsp;a&nbsp;block&nbsp;of&nbsp;thread-specific&nbsp;data,&nbsp;it&nbsp;is&nbsp;automatically&nbsp;&nbsp;<BR>allocated&nbsp;and&nbsp;initialized&nbsp;to&nbsp;all&nbsp;zeros.&nbsp;&nbsp;<BR>These&nbsp;objects&nbsp;are&nbsp;also&nbsp;cleaned&nbsp;up&nbsp;automatically&nbsp;when&nbsp;a&nbsp;thread&nbsp;is&nbsp;&nbsp;<BR>terminated.&nbsp;The&nbsp;thread-specific&nbsp;data&nbsp;is&nbsp;cleaned&nbsp;up&nbsp;early,&nbsp;right&nbsp;after&nbsp;&nbsp;<BR>the&nbsp;per-thread&nbsp;exit&nbsp;handlers&nbsp;are&nbsp;called.&nbsp;If&nbsp;you&nbsp;need&nbsp;to&nbsp;clean&nbsp;up&nbsp;&nbsp;<BR>information&nbsp;associated&nbsp;with&nbsp;thread&nbsp;specific&nbsp;data,&nbsp;use&nbsp;a&nbsp;per-thread&nbsp;&nbsp;<BR>exit&nbsp;handler&nbsp;to&nbsp;do&nbsp;it.&nbsp;&nbsp;<BR>&nbsp;<BR>Reader's&nbsp;Comments&nbsp;<BR>The&nbsp;following&nbsp;commands&nbsp;for&nbsp;the&nbsp;thread&nbsp;extension&nbsp;v2.1&nbsp;haven't&nbsp;been&nbsp;&nbsp;<BR>documented&nbsp;yet:&nbsp;&nbsp;<BR>thread::mutex,&nbsp;<BR>thread::cond,&nbsp;<BR>thread::sv_get,&nbsp;<BR>thread::sv_exists,&nbsp;<BR>thread::sv_set,&nbsp;<BR>thread::sv_incr,&nbsp;<BR>thread::sv_append,&nbsp;<BR>thread::sv_lappend,&nbsp;<BR>thread::sv_array,&nbsp;<BR>thread::sv_unset&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>sv_*&nbsp;means&nbsp;shared&nbsp;variable&nbsp;&nbsp;<BR>&nbsp;<BR>--&nbsp;David&nbsp;Gravereaux,&nbsp;September&nbsp;15&nbsp;18:35:05,&nbsp;2000&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>&nbsp;&nbsp;桃花坞里桃花庵,桃花庵下桃花仙;桃花仙人种桃树,又摘桃花卖酒钱。&nbsp;<BR>&nbsp;&nbsp;酒醒只在花前坐,酒醉换来花下眠;半醒半醉日复日,花落花开年复年。&nbsp;<BR>&nbsp;&nbsp;但愿老死花酒间,不愿鞠躬车马前;车尘马足富者趣,酒盏花枝贫者缘。&nbsp;<BR>&nbsp;&nbsp;若将富贵比贫贱,一在平地一在天;若将贫贱比车马,他得驱驰我得闲。&nbsp;<BR>&nbsp;&nbsp;别人笑我忒疯癫,我笑他人看不穿;不见五陵豪杰墓,无花无酒锄做田。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;202.204.7.234]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -