有没有办法解决以下线程相关的问题?
你能不能帮我解决这个问题。
答案 0 :(得分:0)
虽然您可以使用thread::transfer
移动线程之间的通道,但您不能同时在多个线程中使用相同的通道(请不要移动服务器套接字);有没有 thread::copy_channel
。 (想一想:如果你在两个线程中有相同的通道,并且两个都有可读的事件处理程序设置,当通道可读时会发生什么?有一个竞争条件。可写通道存在同样的问题,尽管大多数代码没有注意到,因为Tcl的默认行为通常是足够好的。)
使用thread::transfer
,在源线程中执行:
thread::transfer $targetThreadID $channel
在目标线程中,在源中的上述代码发生之后,您可以正常访问该通道。假设您在线程的最顶级主解释器中(子解释器通过interp
正常管理)。在实践中,您通常在传输后在源线程中执行thread::send
或thread::eval
,以告诉目标的Tcl脚本他们现在负责解释器。
对于日志记录,让一个线程管理日志文件,其他线程只是向记录器线程发送消息以将其写出。在每个线程中隐藏记录器对象(一个线程中的“真实”,其他线程中的“线程感知代理”)中的详细信息,以便代码中的任何其他内容都不知道您要做什么。