当前位置: 首页 > 面试题库 >

为什么该程序在我的系统上终止而不在操场上终止?

贲俊才
2023-03-14
问题内容

考虑以下程序:

package main

import "fmt"
import "time"
import "runtime"

func main() {

    x := 0

    go func() {
        time.Sleep(500 * time.Millisecond)
        x = 1
    }()

    for x == 0 {
        runtime.Gosched()
    }

    fmt.Println("it works!")
}

为什么它在本地终止而不在Playground终止?我的程序终止是否依赖未定义的行为?


问题答案:

代码不能提供太多保证。它几乎完全依赖于围绕未定义行为的实现细节。

在大多数多线程系统中,不能保证一个线程中的更改不会出现障碍。您有一个goroutine,可以在另一个处理器上运行,总共将一个值写入一个没有人保证读取的变量。

for x == 0 {可以很容易地重写for {,因为从未有一个保证该变量的任何变化可能是可见的。

种族探测器也可能会报告此问题。您真的不应该期望此方法有效。如果您想要一个,sync.WaitGroup您应该只使用一个,因为它可以正确地跨线程协调。



 类似资料:
  • 昨天我在python中使用多重处理处理了大约2000万行的日志文件。 启动名为“producer”的进程,逐行读取文件并将其放入队列 代码在下面 结果很奇怪,工作完成后,消费者进程不会终止,并且主函数在连接()处被阻塞。 使用以下不同的套装和代码进行测试: 使用test_get_ip()而不进行多处理来处理大小日志文件,效果很好 那么,有什么问题?列表中有限制吗?有什么我错过的吗? 我的机器环境是

  • 问题内容: 今天,我实验室中的一个敏感操作完全出错。电子显微镜上的执行器越过边界,经过一连串的事件,我损失了1200万美元的设备。我将有故障的模块中的超过40K行缩小为: 我得到的一些输出示例: 由于这里没有任何浮点算法,而且我们都知道有符号整数在Java中的溢出情况下表现良好,因此我认为这段代码没有错。但是,尽管输出表明程序未达到退出条件,但程序仍达到了退出条件(是否达到 和 未达到?)。为什么

  • 我的进程在linux服务器上被杀,无需人工干预。我已经验证了以下场景。 用户或管理员均未进行手动干预以杀死 该进程占用16.5GB的虚拟内存,其中RAM为16GB,交换为50GB。 任务:总共393个,2个跑步,387个睡觉,4个停止,0个僵尸 Cpu:12.8%us,0.5%sy,0.0%ni,86.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st 内存:总共16015M,使用8

  • 问题内容: 我正在尝试使用H2OR内的库在具有7000万行和25个数字特征的训练集上使用随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取了H2O对象中的两个文件。 然后,我给出以下命令来构建模型: 但是几分钟(不生成任何树)后,出现以下错误: “ .h2o.doSafeREST中的错误(conn = conn,h2

  • 我正在开发一个程序,在这个程序中,我使用了大量但有限的内存。内存在不同线程上运行时分配和释放。但是,我注意到程序的内存使用不会保持在指定的范围内。随着时间的推移,它会增加。我编写了以下示例程序来检查内存是否被释放回操作系统。一半分配的内存被释放以检查内存使用是否下降。 运行程序后,操作系统似乎不会回收释放的页面。分配内存和释放内存后,内存使用情况与linux中的“top”命令中的相同。它只是将这些

  • 我可以使用什么终端命令来终止MacOSX上的光标/鼠标进程? 我正在使用终端中的另一个命令更改鼠标的大小,现在我需要重新启动显示光标的过程。我已经搜索了几个小时来寻找一个类似的话题,但没有找到。 有人知道如何做到这一点吗?