为什么互斥锁代码会停止另一个完整的例程?

硬通
var m *sync.RWMutex
func main() {
    m = new(sync.RWMutex)
    n := 100
    go func() {
        for i := 0; i < n; i++ {
            write("WA", i)
        }
    }()

    go func() {
        for i := 0; i < n; i++ {
            write("WB", i)
        }
    }()

    select {}
}
func write(tag string, i int) {
    m.Lock()
    fmt.Printf("[%s][%s%d]write start \n", tag, tag, i)
    time.Sleep(100 * time.Millisecond)
    fmt.Printf("[%s][%s%d]write end \n", tag, tag, i)
    m.Unlock()

    // time.Sleep(1 * time.Millisecond)
}

结果进入控制台:

去运行mutex.go
[WB] [WB0]写入开始
[WB] [WB0]写入结束
[WB] [WB1]写入开始
[WB] [WB1]写入结束
[WB] [WB2]写入开始
[WB] [WB2 ]写结束
[WB] [WB3]写开始
[WB] [WB3]写结束
[WB] [WB4]写开始
[WB] [WB4]写结束
[WB] [WB5]写开始
[WB] [WB5]写结束
[WB] [WB6]写入开始
[WB] [WB6]写入结束
[WB] [WB7]写入开始
[WB] [WB7]写入结束
[WB] [WB8]写入开始
[WB] [WB8]写入结束
[ WB] [WB9]写入开始
[WB] [WB9]写入结束...

> go version
go version go1.5.2 windows/amd64

问题是:为什么没有机会进行“ [WA]”程序?为什么互斥锁代码会停止另一个完整的例程?

我知道必须有一个故事或一个理论。请给我一个网址来阅读和学习。

彼得·索

Go使用协作式多任务处理;它不使用抢先式诱变:计算机多任务处理您需要使调度程序有机会在锁之间运行。例如,通过调用Gosched(),

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    n := 100
    go func() {
        for i := 0; i < n; i++ {
            write("WA", i)
        }
    }()

    go func() {
        for i := 0; i < n; i++ {
            write("WB", i)
        }
    }()

    select {}
}

func write(tag string, i int) {
    m.Lock()
    fmt.Printf("[%s][%s%d]write start \n", tag, tag, i)
    time.Sleep(100 * time.Millisecond)
    fmt.Printf("[%s][%s%d]write end \n", tag, tag, i)
    m.Unlock()
    runtime.Gosched()
}

输出:

[WB][WB0]write start 
[WB][WB0]write end 
[WA][WA0]write start 
[WA][WA0]write end 
[WB][WB1]write start 
[WB][WB1]write end 
[WA][WA1]write start 
[WA][WA1]write end 
[WB][WB2]write start 
[WB][WB2]write end 
[WA][WA2]write start 
[WA][WA2]write end 
[WB][WB3]write start 
[WB][WB3]write end 
[WA][WA3]write start 
[WA][WA3]write end 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么IX锁与InnoDB中的另一个IX锁兼容?

来自分类Dev

在另一个Clojure命名空间中执行代码,为什么需要eval?

来自分类Dev

为什么不将互斥锁锁定在一个线程中而不阻止将同一互斥锁锁定在另一个线程中?

来自分类Dev

在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

来自分类Dev

在Java中将一个文件追加到另一个文件-为什么我的代码会覆盖?

来自分类Dev

为什么一个输入比另一个输入具有更大的权重

来自分类Dev

为什么一个查询有效,而另一个无效?

来自分类Dev

为什么一个表达式是常数,而不是另一个?

来自分类Dev

为什么我的div在代码中与另一个div重叠?

来自分类Dev

为什么在执行另一个查询后我的while循环停止?

来自分类Dev

停止执行另一个代码的代码

来自分类Dev

为什么一个对象大于/小于或等于另一个对象?

来自分类Dev

为什么我必须从另一个函数中调用一个函数?

来自分类Dev

如何在增加渴望的负载的同时解决此错误?“ ERROR ThreadError:尝试解锁由另一个线程锁定的互斥锁”

来自分类Dev

为什么互斥锁不需要互斥锁(而该互斥锁则需要互斥锁...)

来自分类Dev

为什么在同一个条件变量上使用多个互斥锁会使此代码崩溃?

来自分类Dev

为什么在smali代码的方法中传递了另一个参数

来自分类Dev

解锁互斥锁的调用是否一定要切换到另一个在锁上被阻塞的线程?

来自分类Dev

为什么一个代码从Firebase给我正确的密钥,而另一个却没有?

来自分类Dev

为什么一个进程被另一个进程挂起?

来自分类Dev

为什么一个进程被另一个进程挂起?

来自分类Dev

为什么我的项目调用另一个项目代码?

来自分类Dev

将变量从子例程全球化到另一个子例程

来自分类Dev

如果我按一个键然后另一个太快,我的 pygame 精灵就会停止移动

来自分类Dev

为什么一个 PHP 代码有效而另一个无效?

来自分类Dev

由一个线程捕获并由另一个 CMSIS 和 FreeRTOS STM 板释放的互斥锁

来自分类Dev

一旦另一个窗口打开,标准输出就会停止在 QTextEdit 中显示

来自分类Dev

为什么容器不能请求另一个?

来自分类Dev

为什么 condition_variable_any 需要一个由 shared_ptr 管理的互斥锁?

Related 相关文章

  1. 1

    为什么IX锁与InnoDB中的另一个IX锁兼容?

  2. 2

    在另一个Clojure命名空间中执行代码,为什么需要eval?

  3. 3

    为什么不将互斥锁锁定在一个线程中而不阻止将同一互斥锁锁定在另一个线程中?

  4. 4

    在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

  5. 5

    在Java中将一个文件追加到另一个文件-为什么我的代码会覆盖?

  6. 6

    为什么一个输入比另一个输入具有更大的权重

  7. 7

    为什么一个查询有效,而另一个无效?

  8. 8

    为什么一个表达式是常数,而不是另一个?

  9. 9

    为什么我的div在代码中与另一个div重叠?

  10. 10

    为什么在执行另一个查询后我的while循环停止?

  11. 11

    停止执行另一个代码的代码

  12. 12

    为什么一个对象大于/小于或等于另一个对象?

  13. 13

    为什么我必须从另一个函数中调用一个函数?

  14. 14

    如何在增加渴望的负载的同时解决此错误?“ ERROR ThreadError:尝试解锁由另一个线程锁定的互斥锁”

  15. 15

    为什么互斥锁不需要互斥锁(而该互斥锁则需要互斥锁...)

  16. 16

    为什么在同一个条件变量上使用多个互斥锁会使此代码崩溃?

  17. 17

    为什么在smali代码的方法中传递了另一个参数

  18. 18

    解锁互斥锁的调用是否一定要切换到另一个在锁上被阻塞的线程?

  19. 19

    为什么一个代码从Firebase给我正确的密钥,而另一个却没有?

  20. 20

    为什么一个进程被另一个进程挂起?

  21. 21

    为什么一个进程被另一个进程挂起?

  22. 22

    为什么我的项目调用另一个项目代码?

  23. 23

    将变量从子例程全球化到另一个子例程

  24. 24

    如果我按一个键然后另一个太快,我的 pygame 精灵就会停止移动

  25. 25

    为什么一个 PHP 代码有效而另一个无效?

  26. 26

    由一个线程捕获并由另一个 CMSIS 和 FreeRTOS STM 板释放的互斥锁

  27. 27

    一旦另一个窗口打开,标准输出就会停止在 QTextEdit 中显示

  28. 28

    为什么容器不能请求另一个?

  29. 29

    为什么 condition_variable_any 需要一个由 shared_ptr 管理的互斥锁?

热门标签

归档