为了账号安全,请及时绑定邮箱和手机立即绑定

与runtime.LockOSThread()和runtime.UnlockOSThread

与runtime.LockOSThread()和runtime.UnlockOSThread

Go
绝地无双 2021-04-25 09:14:44
我有一个类似的代码,Routine 1 {runtime.LockOSThread()print somethingsend int to routine 2runtime.UnlockOSThread}Routine 2 {runtime.LockOSThread()print somethingsend int to routine 1runtime.UnlockOSThread}main {go Routine1go Routine2}我使用运行时锁定-解锁,因为我不希望例程1的打印与例程2混合使用。但是,执行上述代码后,其输出与没有锁定-解锁的输出相同(意味着打印输出混合在一起)。谁能帮助我为什么这件事发生以及如何迫使这件事发生。注意:我举了一个打印示例,但是有很多打印和发送事件。
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

如果要序列化“打印某些内容”,例如,每个“打印某些内容”都应自动执行,则只需对其进行序列化即可。


您可以用互斥锁包围“打印某些内容”。除非代码死锁因此而起作用,否则代码一定会死锁-而且肯定可以在一个非平凡的程序中轻松实现。


Go进行序列化的简单方法是使用通道。用例行程序收集应打印在一起的所有内容。收集完打印单元后,将其通过通道发送给某些打印“代理”作为“打印作业”单元。该代理将仅接收其“任务”并自动打印每个任务。人们可以免费获得原子性,而且,作为一项重要的奖励,在仅由非相互依赖的“打印单元”生成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)

}


查看完整回答
反对 回复 2021-05-10
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我认为,这是因为runtime.LockOSThread(),runtime.UnlockOSThread并非一直都在工作。它完全取决于CPU,执行环境等。它不能通过任何其他方式强制执行。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信