linux 无锁队列覆盖问题,无锁队列杂谈
質(zhì)量最大vczh粉(402740419) 10:13:17
nobody(1575393351)? 10:10:09
無(wú)鎖隊(duì)列,怎么可能
?
質(zhì)量最大vczh粉(402740419) 10:13:23
用link做,輕輕松松
nobody(1575393351) 10:13:40
多個(gè)線程同時(shí)從隊(duì)列里面取,怎么可能不加鎖。。
uczh.0xDEADBEEF(365128087) 10:13:44
他已經(jīng)發(fā)請(qǐng)求了
vczh四號(hào)粉絲(342775210) 10:13:51
可以不加鎖
質(zhì)量最大vczh粉(402740419) 10:13:51
用link做,真心不用加鎖
vczh四號(hào)粉絲(342775210) 10:13:55
不過(guò)必須用cas
質(zhì)量最大vczh粉(402740419) 10:14:03
CAS是啥
vczh四號(hào)粉絲(342775210) 10:14:06
否則做不了多線程的并發(fā)
nobody(1575393351) 10:14:13
link是什么東西
質(zhì)量最大vczh粉(402740419) 10:30:26
陳梓瀚? 10:27:16
用interlocked compare exchange
當(dāng)tail == null就換一個(gè)new link進(jìn)去
這樣偏麻煩
vczh四號(hào)粉絲(342775210) 10:30:28
會(huì)把問(wèn)題復(fù)雜化
質(zhì)量最大vczh粉(402740419) 10:30:29
有簡(jiǎn)單的辦法
uczh.0xDEADBEEF(365128087) 10:30:30
但性能很好的
質(zhì)量最大vczh粉(402740419) 10:30:43
類似ngxqueue的辦法,保證鏈表里始終有一個(gè)結(jié)點(diǎn)
質(zhì)量最大vczh粉(402740419) 10:30:49
這樣可以避免很多麻煩
uczh.0xDEADBEEF(365128087) 10:31:03
質(zhì)量最大vczh粉(402740419) 10:31:07
只有構(gòu)造和析構(gòu)的時(shí)候 多線程訪問(wèn)會(huì)出問(wèn)題,但這時(shí)候一般又不會(huì)多線程訪問(wèn)
vczh.Iskandar 10:31:17
就算如此你也要對(duì)tail->next == null的時(shí)候做判斷嘛
VCZH.粉絲數(shù)組[0] 10:31:22
質(zhì)量最大vczh粉(402740419)? 10:31:07
只有構(gòu)造和析構(gòu)的時(shí)候 多線程訪問(wèn)會(huì)出問(wèn)題,但這時(shí)候一般又不會(huì)多線程訪問(wèn)
不要做任何假設(shè)
vczh.Iskandar 10:31:26
這樣才能避免兩個(gè)線程同時(shí)push
質(zhì)量最大vczh粉(402740419) 10:31:48
VCZH.粉絲數(shù)組[0](85126585)? 10:31:22
質(zhì)量最大vczh粉(402740419)? 10:31:07
只有構(gòu)造和析構(gòu)的時(shí)候 多線程訪問(wèn)會(huì)出問(wèn)題,但這時(shí)候一般又不會(huì)多線程訪問(wèn)
不要做任何假設(shè)
不是假設(shè),構(gòu)造還沒完成的時(shí)候就把對(duì)象傳給多個(gè)線程從設(shè)計(jì)上來(lái)說(shuō)就是有毛病的
質(zhì)量最大vczh粉(402740419) 10:31:59
析構(gòu)也類似
質(zhì)量最大vczh粉(402740419) 10:32:14
性質(zhì)上和你在別的線程進(jìn)行了野指針操作沒有區(qū)別
VCZH.粉絲數(shù)組[0] 10:32:21
嗯
ooseven(147340642) 10:32:31
這樣設(shè)計(jì)的話,對(duì)象的生命周期很難控制
VCZH.粉絲數(shù)組[0] 10:32:58
reference counting嘛
質(zhì)量最大vczh粉(402740419) 10:33:00
肯定是構(gòu)造完了,才丟給shared_ptr或者別的什么東西,然后才會(huì)多線程考慮持有這個(gè)對(duì)象
VCZH.粉絲數(shù)組[0] 10:33:02
現(xiàn)在流行
vczh.Iskandar 10:33:08
析構(gòu)的時(shí)候
vczh.Iskandar 10:33:13
肯定是所有shared_ptr都完蛋了
vczh.Iskandar 10:33:17
所以這個(gè)時(shí)候也不會(huì)有人訪問(wèn)了
質(zhì)量最大vczh粉(402740419) 10:33:36
陳梓瀚? 10:31:17
就算如此你也要對(duì)tail->next == null的時(shí)候做判斷嘛
嗯嗯,compareandswap就是這里啊
vczh四號(hào)粉絲(342775210) 10:34:23
不僅僅是null的判斷吧
VCZH.粉絲數(shù)組[0] 10:34:33
循環(huán)隊(duì)列里邊
VCZH.粉絲數(shù)組[0] 10:34:44
tail->next == head
VCZH.粉絲數(shù)組[0] 10:34:50
貌似這樣的
質(zhì)量最大vczh粉(402740419) 10:34:56
循環(huán)隊(duì)列?
VCZH.粉絲數(shù)組[0] 10:35:04
ring
VCZH.粉絲數(shù)組[0] 10:35:06
buffer
質(zhì)量最大vczh粉(402740419) 10:35:15
ringbuffer是另一個(gè)概念= =
VCZH.粉絲數(shù)組[0] 10:35:24
囧,我錯(cuò)了
質(zhì)量最大vczh粉(402740419) 10:35:41
剛才那個(gè)是最簡(jiǎn)單的,每個(gè)節(jié)點(diǎn)只能存一個(gè)pointer或者其它相同大小的東西
vczh四號(hào)粉絲(342775210) 10:35:43
質(zhì)量最大vczh粉(402740419) 10:37:16
= = 堆棧這么做是找死啊
質(zhì)量最大vczh粉(402740419) 10:37:19
就是算法有問(wèn)題
vczh.Iskandar 10:37:50
我覺得這個(gè)例子有問(wèn)題
vczh.Iskandar 10:37:55
你每一次push新數(shù)據(jù)進(jìn)去的時(shí)候
vczh四號(hào)粉絲(342775210) 10:37:57
你的系統(tǒng)先把10Wtps過(guò)了,再說(shuō)并發(fā)
vczh.Iskandar 10:38:04
都不能重用節(jié)點(diǎn)
vczh.Iskandar 10:38:06
都必須new一個(gè)新的
質(zhì)量最大vczh粉(402740419) 10:38:45
vczh四號(hào)粉絲(342775210)? 10:37:57
你的系統(tǒng)先把10Wtps過(guò)了,再說(shuō)并發(fā)
噗,我的服務(wù)端是單進(jìn)程多線程模型
質(zhì)量最大vczh粉(402740419) 10:38:53
客戶端才在搞多線程
質(zhì)量最大vczh粉(402740419) 10:39:04
說(shuō)錯(cuò)了
質(zhì)量最大vczh粉(402740419) 10:39:08
服務(wù)端是單線程多金正
質(zhì)量最大vczh粉(402740419) 10:41:02
我的引擎里當(dāng)初做一個(gè)類似tbb那種task式的并行框架(或者類似boost.asio)
質(zhì)量最大vczh粉(402740419) 10:41:20
因?yàn)橼s著出工,直接拿一個(gè)lockfree的list就上了
小老鼠(273245994) 10:41:25
沈陽(yáng)發(fā)生爆炸了
質(zhì)量最大vczh粉(402740419) 10:41:38
結(jié)果性能還可以
vczh.Iskandar 10:41:43
什么爆炸
VCZH.粉絲數(shù)組[0] 10:42:35
因?yàn)橼s著出工,直接拿一個(gè)lockfree的list就上了
自己寫的?
質(zhì)量最大vczh粉(402740419) 10:42:51
很久很久很久以前寫的
質(zhì)量最大vczh粉(402740419) 10:43:05
然后寫這個(gè)的時(shí)候不知道m(xù)em barrier
質(zhì)量最大vczh粉(402740419) 10:43:11
加到引擎里的時(shí)候 加了下barrier
小老鼠(273245994) 10:43:21
9時(shí),太原街地下通道
質(zhì)量最大vczh粉(402740419) 10:43:34
當(dāng)時(shí)還問(wèn)了這兩位將近一天……
小老鼠(273245994) 10:43:46
附近1公里都有震感
小老鼠(273245994) 10:43:57
你說(shuō)這次會(huì)不會(huì)還是死35人.
VCZH.粉絲數(shù)組[0] 10:44:27
牛逼
裝配腦袋(2380479792) 10:44:37
兩·會(huì)就不讓他們好好開
小老鼠(273245994) 10:43:57
你說(shuō)這次會(huì)不會(huì)還是死35人.
VCZH.粉絲數(shù)組[0] 10:44:27
牛逼
裝配腦袋(2380479792) 10:44:37
兩·會(huì)就不讓他們好好開
VCZH.粉絲數(shù)組[0] 10:44:40
我遇到這個(gè)第一想法是開源的弄一個(gè)來(lái)
御虛舟北(314969051) 10:44:41
又黑人
質(zhì)量最大vczh粉(402740419) 10:45:32
VCZH.粉絲數(shù)組[0](85126585)? 10:44:40
我遇到這個(gè)第一想法是開源的弄一個(gè)來(lái)
假設(shè)需要一套整塊功能,肯定用開源的
質(zhì)量最大vczh粉(402740419) 10:45:46
如果只需求一個(gè)點(diǎn)…… 對(duì)我們搞移動(dòng)的來(lái)說(shuō),port成本太高了……
質(zhì)量最大vczh粉(402740419) 10:46:00
不過(guò)本質(zhì)上來(lái)說(shuō)這個(gè)還是幾乎算是用開源的
質(zhì)量最大vczh粉(402740419) 10:46:03
只是我人肉翻譯了下而已
VCZH.粉絲數(shù)組[0] 10:46:35
所以昨天被問(wèn)到這個(gè)問(wèn)題,我很反感那個(gè)家伙,,,
VCZH.粉絲數(shù)組[0] 10:46:44
尼瑪問(wèn)這就是問(wèn)我看過(guò)類似的帖子沒,,,
質(zhì)量最大vczh粉(402740419) 10:47:16
帖子?
vczh一千號(hào)粉絲(327385942) 10:47:29
VCZH.粉絲數(shù)組[0] 10:47:41
就是說(shuō)我看過(guò)討論類似的論文沒有
VCZH.粉絲數(shù)組[0] 10:47:47
看過(guò)就能說(shuō)兩句
VCZH.粉絲數(shù)組[0] 10:47:58
沒看過(guò),面試那一點(diǎn)時(shí)間能想出來(lái)
VCZH.粉絲數(shù)組[0] 10:48:01
還見鬼了
質(zhì)量最大vczh粉(402740419) 10:48:17
??
質(zhì)量最大vczh粉(402740419) 10:48:24
我曾經(jīng)面試一個(gè) 剛畢業(yè)的小伙子,也談不上多優(yōu)秀
質(zhì)量最大vczh粉(402740419) 10:48:32
我面試就問(wèn)的lock-free的隊(duì)列
御虛舟北(314969051) 10:48:33
剛畢業(yè)的小伙子
質(zhì)量最大vczh粉(402740419) 10:48:38
還不是linked-list
VCZH.粉絲數(shù)組[0] 10:48:44
自己想出來(lái)了?
質(zhì)量最大vczh粉(402740419) 10:48:44
是deque的
質(zhì)量最大vczh粉(402740419) 10:49:03
自己肯定想不出來(lái),但已經(jīng)摸到邊了啊,我稍微誘導(dǎo)了一下
質(zhì)量最大vczh粉(402740419) 10:49:05
就出來(lái)了
vczh.Isotope(75497789) 10:49:27
菊苣們,這里能問(wèn)算法題不?
質(zhì)量最大vczh粉(402740419) 10:49:38
知道基本概念了這就是很直觀的東西,需要上升到論文層面么……
質(zhì)量最大vczh粉(402740419) 10:49:45
復(fù)雜一點(diǎn)的數(shù)據(jù)結(jié)構(gòu)可能需要
質(zhì)量最大vczh粉(402740419) 10:49:48
至少隊(duì)列不需要啊= =
質(zhì)量最大vczh粉(402740419) 10:50:18
啥算法題?工作需要還是自己瞎折騰
VCZH.粉絲數(shù)組[0] 10:50:25
你考慮這些和我的方式不太一樣,我覺得這個(gè)東西了解就行了,自己做是下下策
我是不是得改改了?
vczh.Isotope(75497789) 10:50:44
用1*2的矩形去覆蓋m*n的矩形(m*n是偶數(shù)),問(wèn)一共有多少種方法
質(zhì)量最大vczh粉(402740419) 10:50:52
VCZH.粉絲數(shù)組[0](85126585)? 10:50:26
你考慮這些和我的方式不太一樣,我覺得這個(gè)東西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是兩碼事
質(zhì)量最大vczh粉(402740419) 10:51:31
不然vczh大牛也不會(huì)做編譯器和GUI了,反正也沒人用
vczh.Iskandar 10:51:51
小老鼠(273245994) 10:52:15
內(nèi)傷了
質(zhì)量最大vczh粉(402740419) 10:52:38
vczh.Isotope(75497789)? 10:50:44
用1*2的矩形去覆蓋m*n的矩形(m*n是偶數(shù)),問(wèn)一共有多少種方法
ACM題?滾邊去。我會(huì),就是不告訴你
質(zhì)量最大vczh粉(402740419) 10:52:40
ACM毒害人
vczh.Iskandar 10:52:54
做ACM踢掉(逃
質(zhì)量最大vczh粉(402740419) 10:53:02
vczh.Isotope(75497789) 10:53:05
不是ACM題
vczh的腦殘粉(195719555) 10:53:08
vczh.Ismeow(65200296) 10:53:10
為什么踢掉……
vczh.Iskandar 10:53:14
這些就是
vczh.Isotope(75497789) 10:53:17
好像是MS面試題
vczh.Iskandar 10:53:21
這個(gè)群使用來(lái)討論奇技淫巧的
vczh.Iskandar 10:53:27
這是google的面試題,M$才不面這個(gè)
vczh.Konobuta(450635425) 10:53:48
看了下
vczh.Konobuta(450635425) 10:54:05
用了原子指令
質(zhì)量最大vczh粉(402740419) 10:54:07
這是百度的面試題,google才不面這個(gè)
VCZH.粉絲數(shù)組[0] 10:54:08
質(zhì)量最大vczh粉(402740419)? 10:50:52
VCZH.粉絲數(shù)組[0](85126585)? 10:50:26
你考慮這些和我的方式不太一樣,我覺得這個(gè)東西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是兩碼事
不然vczh大牛也不會(huì)做編譯器和GUI了,反正也沒人用
受教了,擠時(shí)間還是多把這些東西實(shí)現(xiàn)一下
vczh一千號(hào)粉絲(327385942) 10:54:50
vczh一千號(hào)粉絲(327385942) 10:55:12
做acm題還是不錯(cuò)的
Sean(123983971) 10:55:15
小矩形可以重疊嗎?
vczh.Konobuta(450635425) 10:55:16
實(shí)際上還是相當(dāng)于加鎖,只是粒度更小
vczh.Konobuta(450635425) 10:55:32
就怕有的平臺(tái)不支持
vczh.Iskandar 10:55:42
不支持CAS的平臺(tái)
vczh.Iskandar 10:55:52
等你學(xué)會(huì)編程之后
vczh.Iskandar 10:56:02
早就消失了
vczh.Konobuta(450635425) 10:54:05
用了原子指令
質(zhì)量最大vczh粉(402740419) 10:54:07
這是百度的面試題,google才不面這個(gè)
VCZH.粉絲數(shù)組[0] 10:54:08
質(zhì)量最大vczh粉(402740419)? 10:50:52
VCZH.粉絲數(shù)組[0](85126585)? 10:50:26
你考慮這些和我的方式不太一樣,我覺得這個(gè)東西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是兩碼事
不然vczh大牛也不會(huì)做編譯器和GUI了,反正也沒人用
受教了,擠時(shí)間還是多把這些東西實(shí)現(xiàn)一下
vczh一千號(hào)粉絲(327385942) 10:54:50
vczh一千號(hào)粉絲(327385942) 10:55:12
做acm題還是不錯(cuò)的
Sean(123983971) 10:55:15
小矩形可以重疊嗎?
vczh.Konobuta(450635425) 10:55:16
實(shí)際上還是相當(dāng)于加鎖,只是粒度更小
vczh.Konobuta(450635425) 10:55:32
就怕有的平臺(tái)不支持
vczh.Iskandar 10:55:42
不支持CAS的平臺(tái)
vczh.Iskandar 10:55:52
等你學(xué)會(huì)編程之后
vczh.Iskandar 10:56:02
早就消失了
vczh.Konobuta(450635425) 10:56:40
萬(wàn)一有呢?
VCZH.粉絲數(shù)組[0] 10:56:43
vczh.Iskandar? 10:55:42
不支持CAS的平臺(tái)
等你學(xué)會(huì)編程之后
早就消失了
確實(shí),我沒見過(guò),除了學(xué)校C51單片機(jī)
裝配腦袋(2380479792) 10:56:50
連ARM都支持
vczh.Iskandar 10:56:50
就是沒有
裝配腦袋(2380479792) 10:57:02
不支持沒法辦事
VCZH.粉絲數(shù)組[0] 10:57:05
如果有,那么肯定是中斷來(lái)做時(shí)分的
vczh.Ismeow(65200296) 10:57:04
51這種平臺(tái)你會(huì)做什么搶占式Multiprogramming么……
裝配腦袋(2380479792) 10:57:07
顯卡都支持。。
vczh.Ismeow(65200296) 10:57:10
我相信不會(huì)吧
vczh.Konobuta(450635425) 10:57:24
好吧
vczh.Konobuta(450635425) 10:57:39
我也換成這個(gè)
vczh.Iskandar 10:57:59
再說(shuō)了,如果不用CAS,你是沒有任何辦法的
質(zhì)量最大vczh粉(402740419) 10:58:25
不支持CAS的設(shè)備一般就是單核設(shè)備了吧
vczh.腦殘粉(50923132) 10:58:27
沒有CAS,同步只能
質(zhì)量最大vczh粉(402740419) 10:58:42
單核設(shè)備 還是能保證單條指令原子性的吧
vczh.Ismeow(65200296) 10:58:52
不支持CAS的設(shè)備一般是不支持多任務(wù)的設(shè)備……
質(zhì)量最大vczh粉(402740419) 10:59:03
用中斷做分時(shí)任務(wù)是OK的
vczh.Ismeow(65200296) 10:59:27
問(wèn)題是就那點(diǎn)可憐的資源……
VCZH.粉絲數(shù)組[0] 10:59:51
多核 多中斷
VCZH.粉絲數(shù)組[0] 10:59:55
就sb了
vczh.Ismeow(65200296) 10:59:56
你做個(gè)什么調(diào)度就爆了
VCZH.粉絲數(shù)組[0] 11:00:17
不過(guò)這樣SB的CPU估計(jì)沒人用
從未來(lái)??過(guò)?(815330718) 11:00:33
沒有cas, 硬生生的 用不可屏蔽中斷+變量 造一個(gè)...
vczh.Ismeow(65200296) 11:00:41
嗯
從未來(lái)??過(guò)?(815330718) 11:00:42
(逃
vczh.Ismeow(65200296) 11:00:54
NMI弄一個(gè),不過(guò)這么弄就要硬件支持吧
vczh.Konobuta(450635425) 11:01:08
uczh.0xDEADBEEF(365128087) 11:01:24
vczh.Iskandar 11:02:10
連cas都沒有的硬件
從未來(lái)??過(guò)?(815330718) 11:02:16
vczh.Iskandar 11:02:18
你想做多線程的事情
小老鼠(273245994) 11:02:19
vczh.Iskandar 11:02:21
只能踩死
質(zhì)量最大vczh粉(402740419) 11:05:35
vczh
質(zhì)量最大vczh粉(402740419) 11:05:43
我今年6月份開始,要大規(guī)模做UI類的東西
vczh.Iskandar 11:05:53
你不是早就做了嗎
質(zhì)量最大vczh粉(402740419) 11:06:11
我什么時(shí)候大規(guī)模做過(guò)可商業(yè)化的UI…… 除了在百度
vczh.Konobuta(450635425) 11:06:21
vczh.Konobuta(450635425) 11:06:31
教我
vczh.Iskandar 11:06:41
不是萌妹紙,滾!
vczh.Konobuta(450635425) 11:06:47
入群求節(jié)操(152606004) 11:06:50
教我
vczh.腦殘粉(50923132) 11:06:58
vczh.Iskandar? 11:06:41
不是萌妹紙,滾!
御虛舟北(314969051) 11:07:00
不是萌妹紙,滾!
質(zhì)量最大vczh粉(402740419) 11:07:08
不是萌妹紙,滾!
vczh.Konobuta(450635425) 11:07:11
質(zhì)量最大vczh粉(402740419) 11:07:12
話說(shuō)回來(lái)
質(zhì)量最大vczh粉(402740419) 11:07:22
GacUI到那時(shí)候能完善到滿足我的需求么= =
質(zhì)量最大vczh粉(402740419) 11:07:30
不然的話,我是用Qt呢還是Qt呢還是Qt呢?
暫時(shí)的理解:
隊(duì)列如果限定插入只從head,彈出只從tail,那么只要滿足head != tail就是,一讀取一寫就是安全的。
總結(jié)
以上是生活随笔為你收集整理的linux 无锁队列覆盖问题,无锁队列杂谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进制在c语言中的作用,C语言中的进制是什
- 下一篇: c语言 结构成员 变量引用,C++结构体