Skip to content

Commit 41a8d59

Browse files
authored
Merge pull request overnote#30 from a331210877/master
Update 07-Go协程调度模型-2.md
2 parents 3f86f56 + c077db4 commit 41a8d59

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

02-并发编程/07-Go协程调度模型-2.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ go程序初始化完毕后,调度器会进行一轮调度(位于runtime中的s
2121

2222
调度器找到G后的流程:
2323
- 如果调度器在一轮调度之初发现当前M已经与某个G锁定,会立即停止调度并阻塞当前M,如果G到了可运行状态,M会被唤醒并继续运行G。
24-
- 如果当前M找到了可运行G,却发现该G与另外的M碎钉,它会唤醒绑定的M来运行该G,并重新为当前M寻找可运行G
24+
- 如果当前M找到了可运行G,却发现该G与另外的M锁定,它会唤醒绑定的M来运行该G,并重新为当前M寻找可运行G
2525
- 如果当前M未与任何G锁定(gcwaiting值不为0),那么停止Go调度器,即STW(Stop the world)并等待运行时串行任务正在执行
2626
- 当锁定和运行时串行任务都为假,执行寻找G。
2727

@@ -103,4 +103,4 @@ Go运行时系统会在分配新内存是会检查Go程序的内存使用增量
103103
注意:
104104
- GOGC环境变量也可以设置GC阈值,但是必须在程序启动前进行设置
105105
- 关闭GC后就需要手动GC,`runtime.GC`函数可以手动触发一次GC,不过这个GC函数会阻塞调用方直到GC完成,此时GC以gcForceBlockMode模式执行
106-
- 调用`runtime/debug`包的`FreeOSMemory`函数也可以手动触发一次串行GC,并在GC完成后执行一次清扫堆操作
106+
- 调用`runtime/debug`包的`FreeOSMemory`函数也可以手动触发一次串行GC,并在GC完成后执行一次清扫堆操作

02-并发编程/08-同步5-原子操作.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ Go的`sync/atomic`包提供的存储函数都是以`Store`为前缀。
8080
atomic.StoreInt32(i *int3, v int32)
8181
```
8282

83-
Go原子存储的特点:存储操作总会成功,因为u关心被操作值的旧值是什么,这与CAS有明显区别。
83+
Go原子存储的特点:存储操作总会成功,因为不关心被操作值的旧值是什么,这与CAS有明显区别。
8484

8585
### 2.5 交换
8686

@@ -108,4 +108,4 @@ Go还提供了`sync/atomic.Value`类型的结构体,用于存储需要原子
108108
- 如果一个原子值没有通过Store方法存储值,那么其Load方法总是返回nil
109109
- 原子值实例一旦存储了一个类型的值,后续再次Store存储时,存储的值必须也是原有的类型
110110

111-
尤其注意:atomic.Value变量(指针类型变量除外)声明后,值不应该被赋值到别处,比如赋值给别的变量,作为参数值传入函数,作为结果值从函数返回等等,这样会有安全隐患。 因为结构体值的复制不但会生产该值的副本,还会生成其中字段的副本,会造成并发安全保护失效。
111+
尤其注意:atomic.Value变量(指针类型变量除外)声明后,值不应该被赋值到别处,比如赋值给别的变量,作为参数值传入函数,作为结果值从函数返回等等,这样会有安全隐患。 因为结构体值的复制不但会生产该值的副本,还会生成其中字段的副本,会造成并发安全保护失效。

0 commit comments

Comments
 (0)