gpt4 book ai didi

multithreading - Tcl的线程安全记录器

转载 作者:行者123 更新时间:2023-12-03 13:17:54 27 4
gpt4 key购买 nike

我的多线程Tcl应用程序需要一个日志记录库。我可以使用标准的logger包吗?如果可以的话,在多线程环境中应用哪些限制?

如果可能,我想在线程之间共享日志记录服务。

谢谢

最佳答案

Tcl线程不共享数据(除非您显式使用Thread包中的某些功能),而是通过消息传递进行通信。因此,似乎可行的方法是设置一个专用的“logger”线程,然后仅将来自工作线程的消息记录到队列中。

否则,争用点可能会在记录器用来实际写入数据的OS资源中的某个位置。

更新好的,这是我实际上建议实现的工作草图:

package require Tcl 8.5
package require Thread

proc make_worker_thread {logger_id body} {
set newbody [list set ::logger $logger_id]
append newbody \n {
proc ::log {severity msg} {
global logger
thread::send $logger [list ::log $severity $msg]
}
} \n $body
thread::create $newbody
}

set logger [thread::create {
package require logger

proc log {severity msg} {
puts "hey, that's it: ($severity) $msg"
}

puts "logger thread created: [thread::id]"

thread::wait
}]

for {set i 0} {$i < 3} {incr i} {
make_worker_thread $logger {
proc post_msg {} {
log notice "A message from [thread::id]"
after 1000 ::post_msg
}

puts "worker thread created: [thread::id]"

after 1000 ::post_msg

thread::wait
}
}

vwait forever

此代码创建一个记录器线程和四个工作线程,每个线程每秒一次将一条消息发布到记录器线程。该代码一直运行到手动中断为止。 logger线程只是将消息传递给控制台,只是将其思想简单地输出,但是正如该线程中已经提到的其他人一样,如果您需要诸如工具之类的奇特东西,则可以使用Tcllib的“logger”包。

重申我的观点:
  • logger包本身大概不了解有关线程的任何知识。
  • Tcl线程分隔良好,通常通过消息传递进行通信。
  • 因此,为记录器创建一个线程并教导工作线程向其发送消息;因此,工作线程与记录器的实现方式无关。

  • P.S.在辅助线程中,可以使用 [thread::send -async ...]使发送日志消息完全异步。

    关于multithreading - Tcl的线程安全记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8037756/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com