我有一个代码,
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混合使用。但是,执行上述代码后,其输出与没有锁定-
解锁的输出相同(意味着打印输出混合在一起)。谁能帮助我为什么这件事发生以及如何迫使这件事发生。
注意:我举了一个打印示例,但是有很多打印和发送事件。
如果您要 序列化 “打印某物”,例如,每个“打印某物”应自动执行,则只需对其进行 序列化即可 。
您可以用互斥锁包围“打印某些内容”。除非代码死锁因此而起作用,否则代码一定会死锁-而且肯定可以在一个非平凡的程序中轻松实现。
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)
}
但是,当我使用命令行中的ndk-build命令编译它时,会出现以下错误: Android NDK:APP_PLATFORM未设置。默认为最小支持版本Android-16。[arm64-v8a]编译:com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor<=com_celik_Abdullah_ImageProce
我遇到了一个家庭作业的麻烦,创建一个调用另一个类的方法的类。给我们下一课: 然后给出以下提示: 实现一个类Portfolio。这个类有两个对象,checking和savings,类型为BankAccount。实现四种方法: 公用无效存款(双倍金额,字符串帐户) 公开无效提取(双倍金额,字符串帐户) 公有作废转账(双倍金额,字符串账户) 公共双getBalance(字符串帐户) 这里的帐户字符串是“
用户连接RADIUS客户端; RADIUS客户端又连接到RADIUS服务器。如果客户端似乎无法与服务器连接,请首先检查以下内容: FreeRADIUS知道这个客户吗?检查FreeRADIUS日志文件中的以下行: Wed May 18 17:53:57 2012 : Error: Ignoring request to authentication address * port 1812 from
我们用的是3.5磅。下面是主变更日志 现在在ChangeLog-V13.0.00.3.xml中,我们有了这些变更集:
资源结构 webcontent/resources/img/logo.png
问题内容: 我看到了这个问题, 所以我对此问题有一个疑问:在以下查询中,在相同日期我得到的结果是不同的。 按列输出: 请帮助我,在此先谢谢。 编辑 我写了一个简单的过程,通过它可以找到下面给出的日期: EXEC simple_test(sysdate); EXEC simple_test(‘01 -JAN-2013’); 为什么会这样? 问题答案: 我想解释一下为什么您会得到不同的结果。 看到这个