go - runtime.LockOSThread() 和 runtime.UnlockOSThread 问题

标签 go

我有这样的代码,

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 - 如何检查goroutine是否创建成功?

mongodb - 在mongoDB中使用golang结构进行嵌套字段更新

go - 如何解析这个日期2018-10-22T2250?

go - channel 提前终止

unit-testing - 访问日志中间件的情况下如何做单元测试

user-interface - GO GUI帮助(走包)

profiling - 有 Go 分析器吗?

带有错误接口(interface)函数的 Golang 解码结构

mongodb - 计算与 Mgo 中的查询匹配的文档数

go - 使用接口(interface)为任意类型创建队列