acl-dev / acl

C/C++ server and network library, including coroutine,redis client,http/https/websocket,mqtt, mysql/postgresql/sqlite client with C/C++ for Linux, Android, iOS, MacOS, Windows, etc..
https://acl-dev.cn
GNU Lesser General Public License v3.0
2.83k stars 937 forks source link

refactor wait_group #342

Closed ChrisCatCP closed 2 months ago

ChrisCatCP commented 2 months ago

重构了wait_group,基本就是参考了golang的实现

zhengshuxin commented 2 months ago

add 为何要 box->push多次,而在wait里却pop一次?与原实现方式是相反的。

ChrisCatCP commented 2 months ago

用来唤醒多个等待者,之前的实现方式不支持多等待,并且wait_group无法进行复用,并且还有些其他的问题。。

zhengshuxin commented 2 months ago

Go里的WaitGroup不是要等待Add里加的次数吗?比如创建10个协程,Add(10),然后 Wait() 实际上是待这个10个协程都调用了Done后Wait 才返回。

ChrisCatCP commented 2 months ago

是的,但是他那个支持复用的,并且可以有多个地方wait

zhengshuxin commented 2 months ago

如果想要象go里的一样,通过Add(10),然后最后通过一个Wait() 完成等待过程,你的实现似乎无法完成这项功能。

ChrisCatCP commented 2 months ago

可以啊,我跑过那个sample了

zhengshuxin commented 2 months ago

能否添加些注释,把设计思想简单介绍一下?

ChrisCatCP commented 2 months ago

额,就是copy了下golang的实现😂

ChrisCatCP commented 2 months ago

中午我加一下注释

ChrisCatCP commented 2 months ago

已经加上注释了

zhengshuxin commented 2 months ago

已经加上注释了

从注释很难理解设计思想呀 :)

ChrisCatCP commented 2 months ago

已经加上注释了

从注释很难理解设计思想呀 :)

state高低32位记录count和waiter,add增加count,done减少count,count为0会唤醒所有等待的线程或协程,wait会增加waiter的数量并且阻塞等待唤醒,大概就是这么个意思。

zhengshuxin commented 2 months ago

已合并,谢谢。

ChrisCatCP commented 2 months ago

好的😊