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)
}
TA贡献1863条经验 获得超2个赞
我认为,这是因为runtime.LockOSThread(),runtime.UnlockOSThread并非一直都在工作。它完全取决于CPU,执行环境等。它不能通过任何其他方式强制执行。
- 3 回答
- 0 关注
- 281 浏览
添加回答
举报