gitalk
gitalk copied to clipboard
学习C++20, 为Go的atomic类型插上一双翅膀
学习C++20, 为Go的atomic类型插上一双翅膀
如果我们将Go语言的并发原语弄的滚瓜烂熟,那么我们使用组合的方式,创造出更高级的并发原语,针对一些特定的并发场景,可以提供更高效的并发原语。 这篇文章就是就是利用atomic中的并发原语和条件变量,组合出类似C++ 20规范中atomic类型的wait/notify_one/notify_all的功能
完全可以使用chan来解决啊,还更简单
func main() {
var (
completed = 0
counter = make(chan struct{}, 16)
)
// 启动多个任务,每个任务模拟不同耗时,然后递减未完成任务数量
for i := 0; i < 16; i++ {
go func() {
// 模拟真实工作...
time.Sleep(50 * time.Millisecond)
counter <- struct{}{}
}()
}
for _ = range counter {
completed++
if completed == 16 {
break
}
}
// 输出已完成任务的数量
fmt.Printf("Tasks completed = %v\n", completed)
}
完全可以使用chan来解决啊,还更简单
func main() { var ( completed = 0 counter = make(chan struct{}, 16) ) // 启动多个任务,每个任务模拟不同耗时,然后递减未完成任务数量 for i := 0; i < 16; i++ { go func() { // 模拟真实工作... time.Sleep(50 * time.Millisecond) counter <- struct{}{} }() } for _ = range counter { completed++ if completed == 16 { break } } // 输出已完成任务的数量 fmt.Printf("Tasks completed = %v\n", completed) }
这实现和原来的场景都不同了。
当然也可以使用 atomic + channel 也能封装成一个,不过没有Cond更清爽一些,因为notify_all/notify_one使用Cond更方便