- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有这样的代码,
Routine 1 {
runtime.LockOSThread()
print something
send int to routine 2
runtime.UnlockOSThread
}
Routine 2 {
runtime.LockOSThread()
print something
send int to routine 1
runtime.UnlockOSThread
}
main {
go Routine1
go Routine2
}
我使用运行时锁定解锁,因为我不想打印例程 1 将与例程 2 混合。但是,执行完上述操作后代码,它的输出与没有锁定解锁相同(意味着打印输出混合)。任何人都可以帮助我为什么这件事发生以及如何强制这发生了。
注意:我举了一个 print something 的例子,但是有很多打印和发送事件。
最佳答案
如果你想序列化“打印一些东西”,例如每个“打印一些东西”都应该以原子方式执行,然后只是序列化它。
您可以用互斥体包围“打印一些东西”。除非代码因此而死锁,否则它会起作用 - 并且肯定它很容易在一个非平凡的程序中实现。
在 Go 中序列化某些东西的简单方法是使用 channel 。在一个(go)例程中收集所有应该一起打印的东西。完成打印单元的收集后,通过 channel 将其作为“打印作业”单元发送给某个打印“代理”。该代理将简单地接收其“任务”并自动打印每一个。人们可以免费获得这种原子性,作为一项重要的奖励,在只有非相互依赖的“打印单元”生成 goroutine 的简单情况下,代码不再容易死锁。
我的意思是:
func printer(tasks chan string) {
for s := range tasks {
fmt.Printf(s)
}
}
func someAgentX(tasks chan string) {
var printUnit string
//...
tasks <- printUnit
//...
}
func main() {
//...
tasks := make(chan string, size)
go printer(tasks)
go someAgent1(tasks)
//...
go someAgentN(tasks)
//...
<- allDone
close(tasks)
}
关于go - runtime.LockOSThread() 和 runtime.UnlockOSThread 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378092/
我正在编写一个包来使用 Go 中的 EDSDK DLL 来控制 Canon DSLR。 这是应我合作伙伴的要求在我们的婚礼上使用的照相亭的个人项目,完成后我很乐意将其发布到 GitHub :)。 查看
我知道在 Go 中,runtime.LockOSThread()将 goroutine 绑定(bind)到一个 OS 线程,并且不允许其他 goroutine 在该线程中执行。对于子 goroutin
Golang 支持 LockOSThread()使当前的 goroutine 专门绑定(bind)到当前的 OS 线程,它也可以 UnlockOSThread() . 是否有任何使用案例受益于此功能?
我找不到如何声明 runtime.LockOSThread()和 runtime.UnlockOSThread() .我将其定义为 [runtime.LockOSThread()] 一些代码 [run
我有这样的代码, Routine 1 { runtime.LockOSThread() print something send int to routine 2 runtime.UnlockOSTh
The documentation对于 runtime.LockOsThread 状态: LockOSThread wires the calling goroutine to its current
我是一名优秀的程序员,十分优秀!