原文:https://studygolang.com/topics/7050

go修改全局变量的问题

测试 goroutine 修改全局变量,有x y 两个全局函数,分别在两个 goroutine f1() 和 f2() 中修改(f1()修改x,f2()修改y),f2() 只多了一行sleep,为什么最终主 goroutine 打印y时,y的值一直是0?? 代码如下

package main

import (
"fmt"
"runtime"
"time"
) var x, y int func main() {
runtime.GOMAXPROCS(3)
go f1()
go f2()
for {
time.Sleep(time.Second * 1)
fmt.Println("x:", x, "y", y)
}
} func f1() {
for {
x = x + 1
time.Sleep(time.Second * 1)
}
} func f2() {
for {
y = y + 1
}
}

  

结果:

我的理解是这样的,不知道是否合理。 为了效率,对内存的写入一般会在每一个处理器中缓冲,并在必要时一起flush到主存。而f2没有Sleep,导致一直没有时间片去flush到主存,f1有Sleep,就会flush到主存,所以x值会变化,y的值没变化。

如果runtime.GOMAXPROCS(1),都不会有打印信息出来。被f2独占

可以这样修改,就会变化

package main

import (
"fmt"
"runtime"
"time"
) var x, y int func main() {
fmt.Println(runtime.NumCPU())
runtime.GOMAXPROCS(3)
go f1(&x)
go f2(&y)
for {
time.Sleep(time.Second * 1)
fmt.Println("x:", x, "y", y)
}
} func f1(x *int) {
for {
*x = *x + 1
time.Sleep(time.Second * 1)
}
} func f2(y *int) {
for {
*y = *y + 1
}
}
smokezl · #2 · 7月之前

1楼 @darren3126 对的,我觉得应该是这样,f1 和 f2 如果都不sleep 的话,相当于分别都独占了M,没有机会写主存 </br>我也测试过,如果是传址的话,值确实会被修改,感谢大神~

TOMFATCAT · #3 · 7月之前

这完全是为了安全,如果你想改变全局变量,可以把它塞到chan里面,要在通信里共享内存,大概是这么理解的,不然所有协程一块去写同一块内存,不加锁还,很容易写花的

package main

import (
"fmt"
"runtime"
"time"
) var x, y int func main() {
fmt.Println(runtime.NumCPU())
runtime.GOMAXPROCS(3)
x = 100
y = 33
go f1(&x)
go f2(&y)
for {
time.Sleep(time.Second * 1)
fmt.Println("x:", x, "y", y)
}
} func f1(x *int) {
for {
*x = *x + 1
time.Sleep(time.Second * 1)
}
} func f2(y *int) {
for {
*y = *y + 1
}
}

  

goroutine 修改全局变量无效问题的更多相关文章

  1. global关键字修改全局变量

    #我们知道全局变量在函数外部,强烈建议不要在函数内部修改全局变量,正常情况下,在函数内部改变全局变量并不影响全局变量的值,举例如下 count = 5 >>> def myfun() ...

  2. win7 Host文件修改后无效的解决办法

    win7 Host文件修改后无效的解决办法 正常情况下hosts文件随时修改随时生效,如果出现修改后不生效的情况,首先确定文件是ascii编码,以windows格式为换行符,然后依次采用如下方法  1 ...

  3. iOS 使用xib定义一个View,修改frame无效问题解决

    遇到过好多次使用自定义view,修改frame无效问题, 之前都是放弃xib,直接手写,发现手写简单的还行,复杂的UI就坑逼了.所以还是需要用到可视化编辑的xib. 整理一下,自己备忘也供iOS开发的 ...

  4. kali linux 2018.2 mysql密码修改后无效,外部无法连接问题。

    kali linux 2018.2 mysql密码修改后无效,外部无法连接问题 Kali Linux 2018.2 默认MySQL数据库是mariadb,可能和MySQL有些细微的变化,只需要做如下处 ...

  5. Ajax修改全局变量问题解决方法(Zepto版)

    前两天项目遇到一个用ajax修改全局变量的案例,一开始无法给这个全局变量修改赋值,在网上查了一下,解决如下: 修改前: var word=1; $.ajax({ url:"myJSON.js ...

  6. JavaScript函数内部修改全局变量的问题【一道面试题】

    JavaScript函数内部修改全局变量的问题 今天 10:44梵天莲华 | 浏览 23 次  Javascript编程语言函数 修改标签 代码如下,为什么加了 function a(){};这个函数 ...

  7. 在函数中修改全局变量的值,需要加global关键字

    一.引用 使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字.如: #! /usr/bin/python a = 1 b = [2, 3] def func(): if ...

  8. Host文件修改后无效的解决办法

    什么是hosts文件? 简单的说,hosts文件是用于本地dns服务(相关主题:什么是DNS缓存,如何清除DNS缓存?)的,采用ip 域名的格式写在一个文本文件当中,Hosts是一个没有扩展名的系统文 ...

  9. 函数中不能对全局变量进行修改,想要修改全局变量需要在变量前面加global

    # def change_name(name):#     global school    #     school = "Mage Linux"#     print(&quo ...

随机推荐

  1. 【长期更新】Leetcode刷题心得与思考

    1.递归与动态规划的思考 Leetcode第95题 递归问题最重要的问题是想明白函数的作用是什么? 这个例子中函数的返回值就是给定a-b这个区间的数字,返回它所有可能的Tree,此时你不需要明白具体怎 ...

  2. 51.Qt-使用ajax获取ashx接口的post数据

    由于当前C++项目需要使用ajax库去post调用ashx接口,接口地址如下所示: 需要传递的参数如下: 然后发现qml比较好调用ajax.js库,所以本章通过C++界面去获取qml方法来实现调用as ...

  3. 在vue中使用axios发送post请求,参数方式

    由于后台接收的参数格式为FormData格式, 在axios中参数格式默认为, 在传参数前,将原先官方提供的格式 改为如下: axios({ url: '../../../room/listRoomP ...

  4. 在使用pandas 0.23.4对日期进行分组排序时报错

    date_df["rank_num"] = date_df.groupby("issuer_id").report_date.agg("rank&qu ...

  5. 【AtCoder】diverta 2019 Programming Contest 2

    diverta 2019 Programming Contest 2 A - Ball Distribution 特判一下一个人的,否则是\(N - (K - 1) - 1\) #include &l ...

  6. kibana发音 logstash发音 ElasticSearch发音 音标 翻译

    kibana [kɪbana] 剋吧那 kei ba na == 扩展 logstash [lɔɡ] [stæ:ʃ] 楼个四die吃 == ElasticSearch [ɪˈlæstɪk] [sɜːt ...

  7. 1267: 展开字符串(Java)

    WUSTOJ 1267: 展开字符串 参考 jamesMusk的博客--Java 判断字符是大写小写或者数字 Description   给三个参数a1,a2,a3和一个字符串,请按以下要求展开该字符 ...

  8. ASP.NET Core分布式项目-2.oauth密码模式identity server4实现

    源码下载 这里根据<ASP.NET Core分布式项目-1.IdentityServer4登录中心>的代码来继续更新oauth密码模式,这里的密码模式比上次的客户端模式更安全 在WebAp ...

  9. (十)web服务与javaweb结合(1)

    一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...

  10. 转------深入理解--Java按值传递和按引用传递

    引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...