Chinaunix首页 | 论坛 | 博客
  • 博客访问: 311994
  • 博文数量: 214
  • 博客积分: 4258
  • 博客等级: 上校
  • 技术积分: 2021
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-02 09:16
个人简介

http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net

文章分类

全部博文(214)

文章存档

2018年(16)

2015年(1)

2014年(2)

2012年(22)

2011年(173)

分类: C/C++

2018-01-30 15:01:24

只执行一次初始化,注意协程的公共变量与私有变量。

点击(此处)折叠或打开

  1. // sync_my project main.go
  2. package main

  3. import (
  4.     "fmt"
  5.     "sync"
  6.     "time"
  7. )

  8. func ExampleOnce() {
  9.     var once sync.Once
  10.     onceBody := func() {
  11.         fmt.Println("Only once")
  12.     }
  13.     done := make(chan bool)
  14.     for i := 0; i < 10; i++ {
  15.         go func(j int) {
  16.             once.Do(onceBody)
  17.             done <- true
  18.             fmt.Printf("routinei: %d put\n", i)
  19.             fmt.Printf("routinej: %d put\n", j)
  20.         }(i)
  21.     }
  22.     for i := 0; i < 10; i++ {
  23.         <-done
  24.         fmt.Printf("main get %d\n", i)
  25.     }
  26.     // Output:
  27.     // Only once
  28. }

  29. func main() {
  30.     ExampleOnce()
  31.     time.Sleep(2)
  32. }
结果输出:
Only once

routinei: 10 put

routinej: 9 put

main get 0

main get 1

main get 2

main get 3

main get 4

main get 5

main get 6

main get 7

main get 8

main get 9

routinei: 10 put

routinej: 4 put

routinei: 10 put

routinej: 6 put

routinei: 10 put

routinej: 1 put

routinei: 10 put

routinei: 10 put

routinej: 5 put

routinei: 10 put

routinej: 3 put

routinei: 10 put

routinej: 2 put

routinei: 10 put

routinej: 7 put

routinej: 0 put

routinei: 10 put

routinej: 8 put

成功: 进程退出代码 0.

---------------------------------------------------
注释:
1.函数onceBody只执行1次
2.为了确保所有协程都执行完,主线程才退出,在主线程最后休眠2秒。
3.i是公共变量,由于cpu操作比io快很多,所有最后i变成10了,语句fmt.Printf("routinei: %d put\n", i)才执行,所以协程输出i都是10。j是协程私有变量,输出传给各个协程的编号,各个协程互不影响。


阅读(429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~