在TCL中跨多个线程访问文件句柄

时间:2014-04-19 09:05:59

标签: multithreading file tcl

我使用的是tcl 8.5版。

我创建了一个Itcl类itcl::class C_LOG,其中我定义了一些私有方法,其中一个是public method openLog {filename} {},其中我正在执行文件打开/追加操作,

if { [catch {open $filename a} logFileId ] } {
    error $logFileId
}

在课外我创建了一个多线程程序public method userInfo,它将userinfo env值打印到上面已经创建的文件中。

puts $logFileId $userinfo.

但我遇到错误can not find channel named fileXXXX

似乎问题是因为我在线程外部创建了一个文件句柄,我试图在一个线程内访问相同的内容,我不确定这是否真的有用,如果有的话, 请让我知道如何将文件句柄/通道传送到线程内。

1 个答案:

答案 0 :(得分:1)

实际上并不难,你必须将文件描述符转移到另一个线程:

::thread::transfer $otherThread $logFileId

一旦你这样做,你只能从这个其他线程访问它 如果你想从不同的线程登录,我建议使用一个自己的线程并发送它应该记录的数据:

set logThread [::thread::create]
thread::transfer $logThread $logFileId
# And to log something:
thread::send -async $logThread [list puts $logFileId $userinfo]