go - 并发信号量顺序执行

标签 go operating-system semaphore synchronous sequential

如何使用信号量顺序并发执行 Go 程序?

我有一个小程序,它只打印从包含数字的数组中读取的内容

package main
import "fmt"
import "sync"

type empty struct{}

 type semaphore chan empty

 // acquire n resources
 func (sem semaphore) P(n int) {
 e := empty{}
 for i := 0; i < n; i++ {
    sem <- e
 }
 }
 // release n resources
 func (sem semaphore) V(n int) {
    for i := 0; i < n; i++ {
        <-sem
     }
 }


func main() {
var wg sync.WaitGroup
sm := make(semaphore, 2)
var arr []int = []int{1,2,3,4,5,6,7,8,9}

for _,val := range arr{
wg.Add(1)
go func(val int){
    sm.P(1)
    defer sm.V(1)
    defer wg.Done()
    fmt.Print(" val:",val)
      }(val)
}
wg.Wait()
}

输出:

9 1 2 3 4 5 6 7 8

但我希望输出是这样的(根据数组声明)

1 2 3 4 5 6 7 8 9

最佳答案

信号量或互斥量控制同步,而不是操作顺序。并发操作的顺序,无论它们是否同步,都是不可控或不可预测的。如果您需要控制操作顺序,则不应同时执行这些操作。

关于go - 并发信号量顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44659210/

相关文章:

algorithm - 将 CRC32 和从 LSB 优先算法转换为 MSB 优先算法的和

c - 程序的虚拟地址空间有多大?

c# - 信号量:了解初始和最大请求​​数

golang url.PathUnescape 无法在 %% 中工作

go - 如何使用 dep golang 的 fork 包?

go - Go中有fgetpos吗?想要找到 File.Position

android - 如何从具有 OS 11 的 Android 设备获取 mac 地址?

python - 进入子目录、运行命令然后返回的最优雅的方式是什么?

linux - 多进程同步 - 比信号量更好的选择?

c++ - Windows 信号量和 QSystemSemaphore