3 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果要序列化“打印某些內(nèi)容”,例如,每個(gè)“打印某些內(nèi)容”都應(yīng)自動(dòng)執(zhí)行,則只需對(duì)其進(jìn)行序列化即可。
您可以用互斥鎖包圍“打印某些內(nèi)容”。除非代碼死鎖因此而起作用,否則代碼一定會(huì)死鎖-而且肯定可以在一個(gè)非平凡的程序中輕松實(shí)現(xiàn)。
Go進(jìn)行序列化的簡(jiǎn)單方法是使用通道。用例行程序收集應(yīng)打印在一起的所有內(nèi)容。收集完打印單元后,將其通過(guò)通道發(fā)送給某些打印“代理”作為“打印作業(yè)”單元。該代理將僅接收其“任務(wù)”并自動(dòng)打印每個(gè)任務(wù)。人們可以免費(fèi)獲得原子性,而且,作為一項(xiàng)重要的獎(jiǎng)勵(lì),在僅由非相互依賴的“打印單元”生成goroutine的簡(jiǎn)單情況下,代碼不再容易死鎖。
我的意思是:
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貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
我認(rèn)為,這是因?yàn)閞untime.LockOSThread(),runtime.UnlockOSThread并非一直都在工作。它完全取決于CPU,執(zhí)行環(huán)境等。它不能通過(guò)任何其他方式強(qiáng)制執(zhí)行。
- 3 回答
- 0 關(guān)注
- 316 瀏覽
添加回答
舉報(bào)