gitalk icon indicating copy to clipboard operation
gitalk copied to clipboard

学习C++20, 为Go的atomic类型插上一双翅膀

Open utterances-bot opened this issue 2 years ago • 2 comments

学习C++20, 为Go的atomic类型插上一双翅膀

如果我们将Go语言的并发原语弄的滚瓜烂熟,那么我们使用组合的方式,创造出更高级的并发原语,针对一些特定的并发场景,可以提供更高效的并发原语。 这篇文章就是就是利用atomic中的并发原语和条件变量,组合出类似C++ 20规范中atomic类型的wait/notify_one/notify_all的功能

https://colobu.com/2024/01/06/extend-atomic/

utterances-bot avatar Jan 07 '24 10:01 utterances-bot

完全可以使用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)
}

mangohow avatar Jan 07 '24 10:01 mangohow

完全可以使用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更方便

smallnest avatar Jan 07 '24 14:01 smallnest