当前在线人数14172
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
最近组内争论,结果发现不用多线程了
[版面:葵花宝典][首篇作者:bihai] , 2021年09月20日22:15:48 ,3919次阅读,44次回复
来APP回复,赚取更多伪币 关注本站公众号:
[首页] [上页][下页][末页] [分页:1 2 3 ]
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 1 ]

发信人: bihai (学得不好), 信区: Programming
标  题: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Mon Sep 20 22:15:49 2021, 美东)

C++项目中看到一个两年前的代码很类似,就抄了一下。结果,审查的时候追着问为什
么多线程?

主要我不知道单线程怎么做。结果方向是异步。本来项目就是一个消息循环处理各类的
,然后各种callback。关键我们这个需求本来有一个client,但是还必须提供一个
server,多线程一共三行代码来启动这个server,另一个线程专注client端。

如果改成单线程异步需要改动不小,主要是我们其中每步都要完成后再继续,其中之一
就是需要server收到一个消息之后再继续。用多线程等在那里非常简单。改成异步,我
估计可以。但是代码量超过十几行。只是同一个线程既处理客户端又处理服务器有些不
可思议。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
lestrois2000
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 2 ]

发信人: lestrois2000 (lestrois2000), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 00:22:30 2021, 美东)

要看多线程里的IO block程度而定。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 72.]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 3 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 00:54:47 2021, 美东)

具体怎么讲?
【 在 lestrois2000 (lestrois2000) 的大作中提到: 】
: 要看多线程里的IO block程度而定。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
lestrois2000
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 4 ]

发信人: lestrois2000 (lestrois2000), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 01:23:56 2021, 美东)

创建线程的缺陷在于如果线程过多且每个线程内IO Block时间过长,那么大量的线程是
在等待IO的状态,使得CPU利用率实际上不高,创建多线程意义不大,开销还不小,是
经典的C10K problem。解决的方法是用单线程,或少量线程,利用OS的EPoll/Kqueue来
进行event loop,提高效率,降低资源利用率。
【 在 bihai (学得不好) 的大作中提到: 】
: 具体怎么讲?



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 72.]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 5 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 02:03:36 2021, 美东)

你说的可以使用线程池解决吧。

我们这个就这个类有这个一次性阻塞,大概需要十几秒写磁盘的任务。然后即继续干下
一步。其他任务和这个没关系。其他任务没有多线程。

【 在 lestrois2000 (lestrois2000) 的大作中提到: 】
: 创建线程的缺陷在于如果线程过多且每个线程内IO Block时间过长,那么大量的线程是
: 在等待IO的状态,使得CPU利用率实际上不高,创建多线程意义不大,开销还不小,是
: 经典的C10K problem。解决的方法是用单线程,或少量线程,利用OS的EPoll/Kqueue来
: 进行event loop,提高效率,降低资源利用率。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
netghost
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: netghost (Up to Isomorphism), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 02:53:15 2021, 美东)

你這個情況用多線程沒有什麼問題。很多人估計從來不知道操作系統怎麼處理io的,然
後就學了一堆的什麼異步之類的buzzword,純粹瞎搞。

【 在 bihai (学得不好) 的大作中提到: 】
: 你说的可以使用线程池解决吧。
: 我们这个就这个类有这个一次性阻塞,大概需要十几秒写磁盘的任务。然后即继续干下
: 一步。其他任务和这个没关系。其他任务没有多线程。




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
BroPingtou
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: BroPingtou (ǢŦĦȆȐ), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 09:36:34 2021, 美东)

参考下redis的设计?

https://zhuanlan.zhihu.com/p/52600663
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 174.]

 
pptwo
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: pptwo (pp), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 10:52:31 2021, 美东)

从javascript开始到最近几乎所有语言一窝蜂上coroutine,单线程消息循环callback
图的就是一个不用加锁写起来不费脑子,小白程序员也不会犯啥错。你把它改成多线
程的,锁怎么加,加到哪个粒度都不是个简单的事情,人家不愿意费这个工夫,只能
让你改回去。

【 在 bihai (学得不好) 的大作中提到: 】
: C++项目中看到一个两年前的代码很类似,就抄了一下。结果,审查的时候追着问为什
: 么多线程?
: 主要我不知道单线程怎么做。结果方向是异步。本来项目就是一个消息循环处理各类的
: ,然后各种callback。关键我们这个需求本来有一个client,但是还必须提供一个
: server,多线程一共三行代码来启动这个server,另一个线程专注client端。
: 如果改成单线程异步需要改动不小,主要是我们其中每步都要完成后再继续,其中之一
: 就是需要server收到一个消息之后再继续。用多线程等在那里非常简单。改成异步,我
: 估计可以。但是代码量超过十几行。只是同一个线程既处理客户端又处理服务器有些不
: 可思议。



--

※ 修改:·pptwo 于 Sep 21 10:53:06 2021 修改本文·[FROM: 67.]
※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
netghost
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: netghost (Up to Isomorphism), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 10:57:30 2021, 美东)

你想多了,就是buzzword這幾年火了。而且消息循環不是win32時代的標準做法麼?

實際上,一定要比這種亂callback的程序更沒法debug。
【 在 pptwo (pp) 的大作中提到: 】
: 标  题: Re: 最近组内争论,结果发现不用多线程了
: 发信站: BBS 未名空间站 (Tue Sep 21 10:52:31 2021, 美东)
:
: 从javascript开始到最近几乎所有语言一窝蜂上coroutine,单线程消息循环
callback
: 图的就是一个不用加锁写起来不费脑子,小白程序员也不会犯啥错。你把它改成多线
: 程的,锁怎么加,加到哪个粒度都不是个简单的事情,人家不愿意费这个工夫,只能
: 让你改回去。
:
: 【 在 bihai (学得不好) 的大作中提到: 】
: : C++项目中看到一个两年前的代码很类似,就抄了一下。结果,审查的时候追着问
为什
: : 么多线程?
: : 主要我不知道单线程怎么做。结果方向是异步。本来项目就是一个消息循环处理各
类的
: : ,然后各种callback。关键我们这个需求本来有一个client,但是还必须提供一个
: : server,多线程一共三行代码来启动这个server,另一个线程专注client端。
: : 如果改成单线程异步需要改动不小,主要是我们其中每步都要完成后再继续,其中
之一
: : 就是需要server收到一个消息之后再继续。用多线程等在那里非常简单。改成异步
,我
: : 估计可以。但是代码量超过十几行。只是同一个线程既处理客户端又处理服务器有
些不
: : 可思议。
:
:
:
: --
:
: ※ 修改:·pptwo 于 Sep 21 10:53:06 2021 修改本文·[FROM: 67.]
: ※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]
:



--

※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 15:45:55 2021, 美东)

没有锁。主线程生成一个数据结构,给新线程使用,但是主线程自己不用。主线程函数
调用后就等在那里。函数调用结束了,主线程就继续。这个时候新线程也结束了。

【 在 pptwo (pp) 的大作中提到: 】
: 从javascript开始到最近几乎所有语言一窝蜂上coroutine,单线程消息循环
callback
: 图的就是一个不用加锁写起来不费脑子,小白程序员也不会犯啥错。你把它改成多线
: 程的,锁怎么加,加到哪个粒度都不是个简单的事情,人家不愿意费这个工夫,只能
: 让你改回去。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
netghost
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: netghost (Up to Isomorphism), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 15:54:12 2021, 美东)

你這樣的話,爲啥要起一個新線程,直接一個線程走完不就完事了。
【 在 bihai (学得不好) 的大作中提到: 】
: 没有锁。主线程生成一个数据结构,给新线程使用,但是主线程自己不用。主线程函数
: 调用后就等在那里。函数调用结束了,主线程就继续。这个时候新线程也结束了。
: callback



--

※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
lightroom
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: lightroom (吃一条鱼,思考一个问题,法号三丰), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 16:05:22 2021, 美东)

这不是最简单producer consumer的吗?

【在  bihai(学得不好)的大作中提到:】
:没有锁。主线程生成一个数据结构,给新线程使用,但是主线程自己不用。主线程函
数调用后就等在那里。函数调用结束了,主线程就继续。这个时候新线程也结束了。


--
※ 来源:·Android 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2604:ca00:11a:9]

 
guvest
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: guvest (我爱你老婆Anna), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 18:30:35 2021, 美东)

“ 函数调用结束了,”

这函数什么条件下return?


【 在 bihai(学得不好) 的大作中提到: 】
<br>: 没有锁。主线程生成一个数据结构,给新线程使用,但是主线程自己不用。主线
程函数
<br>: 调用后就等在那里。函数调用结束了,主线程就继续。这个时候新线程也结束了。
<br>: callback
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:5fe2:]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 23:51:21 2021, 美东)

客户端调用的时候,提供了一个类的实例作为参数,然后阻塞在那里;
被调用的程序通过这个实例进行一些数据的读取;但是因为原线程的阻塞,无法进行下
去。这里,应该认为不是被调用的程序直接调用客户端,而是间接,比如通过网络。客
户端是否响应是客户端自己决定的。

客户端调用这个函数的时候也不是直接调用,而是间接的通过系统。客户端自己看来就
阻塞了。系统负责通知被调用的程序获得所有的信息,和进行工作。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: “ 函数调用结束了,”
: 这函数什么条件下return?
: <br>: 没有锁。主线程生成一个数据结构,给新线程使用,但是主线程自己不用。主线
: 程函数
: <br>: 调用后就等在那里。函数调用结束了,主线程就继续。这个时候新线程也结束
了。
: <br>: callback
: <br>



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Tue Sep 21 23:53:29 2021, 美东)

我今天才学到一个线程怎么干。总的来说,我们这个系统就没看到几个线程的例子。说
是有一些系统的操作导致线程不安全。我们随便写一个类,就会在一个线程启动,如果
我们开了新线程,就可能在新线程销毁,这是就会出错。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 你這樣的話,爲啥要起一個新線程,直接一個線程走完不就完事了。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
digua
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: digua (姚之FAN), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Wed Sep 22 08:15:32 2021, 美东)

你这个帖子我有些疑问。改成异步,代码量超过十几行,你说的真的是十几行吗?如果
是这样,为什么纠结呢?

我记得你以前说过是搞嵌入式系统的?异步编程是嵌入式编程的基本功。在嵌入式应用
中,异步一般比多线程效率更高。处理器性能足够时,表面上看不出来差别,但在能效
上总是有差别的。

【 在 bihai (学得不好) 的大作中提到: 】
: C++项目中看到一个两年前的代码很类似,就抄了一下。结果,审查的时候追着问为什
: 么多线程?
: 主要我不知道单线程怎么做。结果方向是异步。本来项目就是一个消息循环处理各类的
: ,然后各种callback。关键我们这个需求本来有一个client,但是还必须提供一个
: server,多线程一共三行代码来启动这个server,另一个线程专注client端。
: 如果改成单线程异步需要改动不小,主要是我们其中每步都要完成后再继续,其中之一
: 就是需要server收到一个消息之后再继续。用多线程等在那里非常简单。改成异步,我
: 估计可以。但是代码量超过十几行。只是同一个线程既处理客户端又处理服务器有些不
: 可思议。

--
※ 修改:·digua 於 Sep 22 08:16:48 2021 修改本文·[FROM: 73.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
netghost
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 17 ]

发信人: netghost (Up to Isomorphism), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Wed Sep 22 15:24:19 2021, 美东)

OK,那就是你們的tech lead不讓你能在一個代碼模塊裏面用兩個CPU,調度要他管。這
屬於政治問題,和技術關係不大。
【 在 bihai (学得不好) 的大作中提到: 】
: 我今天才学到一个线程怎么干。总的来说,我们这个系统就没看到几个线程的例子。说
: 是有一些系统的操作导致线程不安全。我们随便写一个类,就会在一个线程启动,如果
: 我们开了新线程,就可能在新线程销毁,这是就会出错。



--

※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 18 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Wed Sep 22 22:31:25 2021, 美东)

现在懂了,就不难了。

我们的架构是用promise来等待任务完成。任务本身就是一个函数,比如写磁盘,同步
阻塞很容易懂。但是如果是异步,要等callback之后才知道结束了,这个函数怎么写来
和promise匹配就不清楚了。后来给了一个办法很麻烦。昨天有个人告诉我可以直接处
理消息循环。结果代码行数和现在一样,而且基本是不变的,只是把额外的线程去掉了
。这个我就容易理解了。

【 在 digua (姚之FAN) 的大作中提到: 】
: 你这个帖子我有些疑问。改成异步,代码量超过十几行,你说的真的是十几行吗?如果
: 是这样,为什么纠结呢?
: 我记得你以前说过是搞嵌入式系统的?异步编程是嵌入式编程的基本功。在嵌入式应用
: 中,异步一般比多线程效率更高。处理器性能足够时,表面上看不出来差别,但在能效
: 上总是有差别的。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
bihai
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 19 ]

发信人: bihai (学得不好), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Wed Sep 22 22:34:46 2021, 美东)

目前还没看到使用多CPU多线程干事情的。不行就多进程吧。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: OK,那就是你們的tech lead不讓你能在一個代碼模塊裏面用兩個CPU,調度要他管。這
: 屬於政治問題,和技術關係不大。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:647:4d00:a]

 
haidafu
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 20 ]

发信人: haidafu (海大富), 信区: Programming
标  题: Re: 最近组内争论,结果发现不用多线程了
发信站: BBS 未名空间站 (Wed Sep 22 23:33:38 2021, 美东)

async + event_base + thread pool vs 多线程
请教一下: async 到底优势在哪?下面理解对不对。
1)thread pool的线程数通常小很多,又不是dynamic create.这样减少了thread
create and destory的开销。这个是async + pool主要的优势。
2)thread pool可以采用last-finished-first-scheduled方式,这样可以减少context
switch的cost.
3) thread如果blocking, 并不浪费cpu resource 因为 Linux kernel会把  cpu core
用给其它的thread. 也不会占用很多内存, madvise会利用thread stack




【 在 lestrois2000 (lestrois2000) 的大作中提到: 】
: 创建线程的缺陷在于如果线程过多且每个线程内IO Block时间过长,那么大量的线程是
: 在等待IO的状态,使得CPU利用率实际上不高,创建多线程意义不大,开销还不小,是
: 经典的C10K problem。解决的方法是用单线程,或少量线程,利用OS的EPoll/Kqueue来
: 进行event loop,提高效率,降低资源利用率。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2620:10d:c090:4]

[首页] [上页][下页][末页] [分页:1 2 3 ]
[快速返回] [ 进入葵花宝典讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996