Error

C++博客 首页 新随笔 联系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

质量最大vczh粉(402740419) 10:13:17

nobody(1575393351)  10:10:09
无锁队列,怎么可能

质量最大vczh粉(402740419) 10:13:23

用link做,轻轻松松

nobody(1575393351) 10:13:40

多个线程同时从队列里面取,怎么可能不加锁。。

uczh.0xDEADBEEF(365128087) 10:13:44

他已经发请求了

vczh四号粉丝(342775210) 10:13:51

可以不加锁

质量最大vczh粉(402740419) 10:13:51

用link做,真心不用加锁

vczh四号粉丝(342775210) 10:13:55

不过必须用cas

质量最大vczh粉(402740419) 10:14:03

CAS是啥

vczh四号粉丝(342775210) 10:14:06

否则做不了多线程的并发

nobody(1575393351) 10:14:13

link是什么东西

质量最大vczh粉(402740419) 10:30:26

陈梓瀚<vczh@163.com>  10:27:16
用interlocked compare exchange
当tail == null就换一个new link进去
这样偏麻烦

vczh四号粉丝(342775210) 10:30:28

会把问题复杂化

质量最大vczh粉(402740419) 10:30:29

有简单的办法

uczh.0xDEADBEEF(365128087) 10:30:30

但性能很好的

质量最大vczh粉(402740419) 10:30:43

类似ngxqueue的办法,保证链表里始终有一个结点

质量最大vczh粉(402740419) 10:30:49

这样可以避免很多麻烦

uczh.0xDEADBEEF(365128087) 10:31:03

质量最大vczh粉(402740419) 10:31:07

只有构造和析构的时候 多线程访问会出问题,但这时候一般又不会多线程访问

vczh.Iskandar<vczh@163.com> 10:31:17

就算如此你也要对tail->next == null的时候做判断嘛

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:31:22

质量最大vczh粉(402740419)  10:31:07
只有构造和析构的时候 多线程访问会出问题,但这时候一般又不会多线程访问
不要做任何假设

vczh.Iskandar<vczh@163.com> 10:31:26

这样才能避免两个线程同时push

质量最大vczh粉(402740419) 10:31:48

VCZH.粉丝数组[0](85126585)  10:31:22
质量最大vczh粉(402740419)  10:31:07
只有构造和析构的时候 多线程访问会出问题,但这时候一般又不会多线程访问
不要做任何假设
不是假设,构造还没完成的时候就把对象传给多个线程从设计上来说就是有毛病的

质量最大vczh粉(402740419) 10:31:59

析构也类似

质量最大vczh粉(402740419) 10:32:14

性质上和你在别的线程进行了野指针操作没有区别

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:32:21

ooseven(147340642) 10:32:31

这样设计的话,对象的生命周期很难控制

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:32:58

reference counting嘛

质量最大vczh粉(402740419) 10:33:00

肯定是构造完了,才丢给shared_ptr或者别的什么东西,然后才会多线程考虑持有这个对象

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:33:02

现在流行

vczh.Iskandar<vczh@163.com> 10:33:08

析构的时候

vczh.Iskandar<vczh@163.com> 10:33:13

肯定是所有shared_ptr都完蛋了

vczh.Iskandar<vczh@163.com> 10:33:17

所以这个时候也不会有人访问了

质量最大vczh粉(402740419) 10:33:36

陈梓瀚<vczh@163.com>  10:31:17
就算如此你也要对tail->next == null的时候做判断嘛
嗯嗯,compareandswap就是这里啊

vczh四号粉丝(342775210) 10:34:23

不仅仅是null的判断吧

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:34:33

循环队列里边

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:34:44

tail->next == head

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:34:50

貌似这样的

质量最大vczh粉(402740419) 10:34:56

循环队列?

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:35:04

ring

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:35:06

buffer

质量最大vczh粉(402740419) 10:35:15

ringbuffer是另一个概念= =

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:35:24

囧,我错了

质量最大vczh粉(402740419) 10:35:41

刚才那个是最简单的,每个节点只能存一个pointer或者其它相同大小的东西

vczh四号粉丝(342775210) 10:35:43

http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html

质量最大vczh粉(402740419) 10:37:16

= = 堆栈这么做是找死啊

质量最大vczh粉(402740419) 10:37:19

就是算法有问题

vczh.Iskandar<vczh@163.com> 10:37:50

我觉得这个例子有问题

vczh.Iskandar<vczh@163.com> 10:37:55

你每一次push新数据进去的时候

vczh四号粉丝(342775210) 10:37:57

你的系统先把10Wtps过了,再说并发

vczh.Iskandar<vczh@163.com> 10:38:04

都不能重用节点

vczh.Iskandar<vczh@163.com> 10:38:06

都必须new一个新的

质量最大vczh粉(402740419) 10:38:45

vczh四号粉丝(342775210)  10:37:57
你的系统先把10Wtps过了,再说并发
噗,我的服务端是单进程多线程模型

质量最大vczh粉(402740419) 10:38:53

客户端才在搞多线程

质量最大vczh粉(402740419) 10:39:04

说错了

质量最大vczh粉(402740419) 10:39:08

服务端是单线程多金正

质量最大vczh粉(402740419) 10:41:02

我的引擎里当初做一个类似tbb那种task式的并行框架(或者类似boost.asio)

质量最大vczh粉(402740419) 10:41:20

因为赶着出工,直接拿一个lockfree的list就上了

小老鼠(273245994) 10:41:25

沈阳发生爆炸了

质量最大vczh粉(402740419) 10:41:38

结果性能还可以

vczh.Iskandar<vczh@163.com> 10:41:43

什么爆炸

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:42:35

因为赶着出工,直接拿一个lockfree的list就上了
自己写的?

质量最大vczh粉(402740419) 10:42:51

很久很久很久以前写的

质量最大vczh粉(402740419) 10:43:05

然后写这个的时候不知道mem barrier

质量最大vczh粉(402740419) 10:43:11

加到引擎里的时候 加了下barrier

小老鼠(273245994) 10:43:21

9时,太原街地下通道

质量最大vczh粉(402740419) 10:43:34

当时还问了这两位将近一天……

小老鼠(273245994) 10:43:46

附近1公里都有震感

小老鼠(273245994) 10:43:57

你说这次会不会还是死35人.

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:44:27

牛逼

装配脑袋(2380479792) 10:44:37

两·会就不让他们好好开

 

小老鼠(273245994) 10:43:57

你说这次会不会还是死35人.

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:44:27

牛逼

装配脑袋(2380479792) 10:44:37

两·会就不让他们好好开

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:44:40

我遇到这个第一想法是开源的弄一个来

御虚舟北(314969051) 10:44:41

又黑人

质量最大vczh粉(402740419) 10:45:32

VCZH.粉丝数组[0](85126585)  10:44:40
我遇到这个第一想法是开源的弄一个来
假设需要一套整块功能,肯定用开源的

质量最大vczh粉(402740419) 10:45:46

如果只需求一个点…… 对我们搞移动的来说,port成本太高了……

质量最大vczh粉(402740419) 10:46:00

不过本质上来说这个还是几乎算是用开源的

质量最大vczh粉(402740419) 10:46:03

只是我人肉翻译了下而已

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:46:35

所以昨天被问到这个问题,我很反感那个家伙,,,

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:46:44

尼玛问这就是问我看过类似的帖子没,,,

质量最大vczh粉(402740419) 10:47:16

帖子?

vczh一千号粉丝(327385942) 10:47:29

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:47:41

就是说我看过讨论类似的论文没有

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:47:47

看过就能说两句

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:47:58

没看过,面试那一点时间能想出来

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:48:01

还见鬼了

质量最大vczh粉(402740419) 10:48:17

??

质量最大vczh粉(402740419) 10:48:24

我曾经面试一个 刚毕业的小伙子,也谈不上多优秀

质量最大vczh粉(402740419) 10:48:32

我面试就问的lock-free的队列

御虚舟北(314969051) 10:48:33

刚毕业的小伙子

质量最大vczh粉(402740419) 10:48:38

还不是linked-list

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:48:44

自己想出来了?

质量最大vczh粉(402740419) 10:48:44

是deque的

质量最大vczh粉(402740419) 10:49:03

自己肯定想不出来,但已经摸到边了啊,我稍微诱导了一下

质量最大vczh粉(402740419) 10:49:05

就出来了

vczh.Isotope(75497789) 10:49:27

菊苣们,这里能问算法题不?

质量最大vczh粉(402740419) 10:49:38

知道基本概念了这就是很直观的东西,需要上升到论文层面么……

质量最大vczh粉(402740419) 10:49:45

复杂一点的数据结构可能需要

质量最大vczh粉(402740419) 10:49:48

至少队列不需要啊= =

质量最大vczh粉(402740419) 10:50:18

啥算法题?工作需要还是自己瞎折腾

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:50:25

你考虑这些和我的方式不太一样,我觉得这个东西了解就行了,自己做是下下策
我是不是得改改了?

vczh.Isotope(75497789) 10:50:44

用1*2的矩形去覆盖m*n的矩形(m*n是偶数),问一共有多少种方法

质量最大vczh粉(402740419) 10:50:52

VCZH.粉丝数组[0](85126585)  10:50:26
你考虑这些和我的方式不太一样,我觉得这个东西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是两码事

质量最大vczh粉(402740419) 10:51:31

不然vczh大牛也不会做编译器和GUI了,反正也没人用

vczh.Iskandar<vczh@163.com> 10:51:51

小老鼠(273245994) 10:52:15

内伤了

质量最大vczh粉(402740419) 10:52:38

vczh.Isotope(75497789)  10:50:44
用1*2的矩形去覆盖m*n的矩形(m*n是偶数),问一共有多少种方法
ACM题?滚边去。我会,就是不告诉你

质量最大vczh粉(402740419) 10:52:40

ACM毒害人

vczh.Iskandar<vczh@163.com> 10:52:54

做ACM踢掉(逃

质量最大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<vczh@163.com> 10:53:14

这些就是

vczh.Isotope(75497789) 10:53:17

好像是MS面试题

vczh.Iskandar<vczh@163.com> 10:53:21

这个群使用来讨论奇技淫巧的

vczh.Iskandar<vczh@163.com> 10:53:27

这是google的面试题,M$才不面这个

vczh.Konobuta(450635425) 10:53:48

看了下 

vczh.Konobuta(450635425) 10:54:05

用了原子指令 

质量最大vczh粉(402740419) 10:54:07

这是百度的面试题,google才不面这个

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:54:08

质量最大vczh粉(402740419)  10:50:52
VCZH.粉丝数组[0](85126585)  10:50:26
你考虑这些和我的方式不太一样,我觉得这个东西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是两码事
不然vczh大牛也不会做编译器和GUI了,反正也没人用
受教了,挤时间还是多把这些东西实现一下

vczh一千号粉丝(327385942) 10:54:50

vczh一千号粉丝(327385942) 10:55:12

做acm题还是不错的

Sean(123983971) 10:55:15

小矩形可以重叠吗?

vczh.Konobuta(450635425) 10:55:16

实际上还是相当于加锁,只是粒度更小 

vczh.Konobuta(450635425) 10:55:32

就怕有的平台不支持 

vczh.Iskandar<vczh@163.com> 10:55:42

不支持CAS的平台

vczh.Iskandar<vczh@163.com> 10:55:52

等你学会编程之后

vczh.Iskandar<vczh@163.com> 10:56:02

早就消失了

vczh.Konobuta(450635425) 10:54:05

用了原子指令 

质量最大vczh粉(402740419) 10:54:07

这是百度的面试题,google才不面这个

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:54:08

质量最大vczh粉(402740419)  10:50:52
VCZH.粉丝数组[0](85126585)  10:50:26
你考虑这些和我的方式不太一样,我觉得这个东西了解就行了,自己做是下下策
做事的方式 和考察、自我考察的方式是两码事
不然vczh大牛也不会做编译器和GUI了,反正也没人用
受教了,挤时间还是多把这些东西实现一下

vczh一千号粉丝(327385942) 10:54:50

vczh一千号粉丝(327385942) 10:55:12

做acm题还是不错的

Sean(123983971) 10:55:15

小矩形可以重叠吗?

vczh.Konobuta(450635425) 10:55:16

实际上还是相当于加锁,只是粒度更小 

vczh.Konobuta(450635425) 10:55:32

就怕有的平台不支持 

vczh.Iskandar<vczh@163.com> 10:55:42

不支持CAS的平台

vczh.Iskandar<vczh@163.com> 10:55:52

等你学会编程之后

vczh.Iskandar<vczh@163.com> 10:56:02

早就消失了

vczh.Konobuta(450635425) 10:56:40

万一有呢? 

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:56:43

vczh.Iskandar<vczh@163.com>  10:55:42
不支持CAS的平台
等你学会编程之后
早就消失了
确实,我没见过,除了学校C51单片机

装配脑袋(2380479792) 10:56:50

连ARM都支持

vczh.Iskandar<vczh@163.com> 10:56:50

就是没有

装配脑袋(2380479792) 10:57:02

不支持没法办事

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:57:05

如果有,那么肯定是中断来做时分的

vczh.Ismeow(65200296) 10:57:04

51这种平台你会做什么抢占式Multiprogramming么……

装配脑袋(2380479792) 10:57:07

显卡都支持。。

vczh.Ismeow(65200296) 10:57:10

我相信不会吧

vczh.Konobuta(450635425) 10:57:24

好吧 

vczh.Konobuta(450635425) 10:57:39

我也换成这个 

vczh.Iskandar<vczh@163.com> 10:57:59

再说了,如果不用CAS,你是没有任何办法的

质量最大vczh粉(402740419) 10:58:25

不支持CAS的设备一般就是单核设备了吧

vczh.脑残粉(50923132) 10:58:27

没有CAS,同步只能

质量最大vczh粉(402740419) 10:58:42

单核设备 还是能保证单条指令原子性的吧

vczh.Ismeow(65200296) 10:58:52

不支持CAS的设备一般是不支持多任务的设备……

质量最大vczh粉(402740419) 10:59:03

用中断做分时任务是OK的

vczh.Ismeow(65200296) 10:59:27

问题是就那点可怜的资源……

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:59:51

多核 多中断

VCZH.粉丝数组[0]<errorcpp@qq.com> 10:59:55

就sb了

vczh.Ismeow(65200296) 10:59:56

你做个什么调度就爆了

VCZH.粉丝数组[0]<errorcpp@qq.com> 11:00:17

不过这样SB的CPU估计没人用

从未来‏̶过‪(815330718) 11:00:33

没有cas, 硬生生的 用不可屏蔽中断+变量 造一个...

vczh.Ismeow(65200296) 11:00:41

从未来‏̶过‪(815330718) 11:00:42

(逃

vczh.Ismeow(65200296) 11:00:54

NMI弄一个,不过这么弄就要硬件支持吧

vczh.Konobuta(450635425) 11:01:08

uczh.0xDEADBEEF(365128087) 11:01:24

vczh.Iskandar<vczh@163.com> 11:02:10

连cas都没有的硬件

从未来‏̶过‪(815330718) 11:02:16

只会写代码,不如去种田
http://www.oschina.net/news/38229/teach-kids-to-farm-not-code

vczh.Iskandar<vczh@163.com> 11:02:18

你想做多线程的事情

小老鼠(273245994) 11:02:19

http://slide.news.sina.com.cn/c/slide_1_2841_30492.html#p=1

vczh.Iskandar<vczh@163.com> 11:02:21

只能踩死

质量最大vczh粉(402740419) 11:05:35

vczh

质量最大vczh粉(402740419) 11:05:43

我今年6月份开始,要大规模做UI类的东西

vczh.Iskandar<vczh@163.com> 11:05:53

你不是早就做了吗

质量最大vczh粉(402740419) 11:06:11

我什么时候大规模做过可商业化的UI…… 除了在百度

vczh.Konobuta(450635425) 11:06:21

vczh.Konobuta(450635425) 11:06:31

教我 

vczh.Iskandar<vczh@163.com> 11:06:41

不是萌妹纸,滚!

vczh.Konobuta(450635425) 11:06:47

入群求节操(152606004) 11:06:50


教我

vczh.脑残粉(50923132) 11:06:58

vczh.Iskandar<vczh@163.com>  11:06:41
不是萌妹纸,滚!

御虚舟北(314969051) 11:07:00

不是萌妹纸,滚!

质量最大vczh粉(402740419) 11:07:08

不是萌妹纸,滚!

vczh.Konobuta(450635425) 11:07:11

质量最大vczh粉(402740419) 11:07:12

话说回来

质量最大vczh粉(402740419) 11:07:22

GacUI到那时候能完善到满足我的需求么= =

质量最大vczh粉(402740419) 11:07:30

不然的话,我是用Qt呢还是Qt呢还是Qt呢?

 

 

 

暂时的理解:

队列如果限定插入只从head,弹出只从tail,那么只要满足head != tail就是,一读取一写就是安全的。


posted on 2013-03-04 11:14 Enic 阅读(1478) 评论(0)  编辑 收藏 引用 所属分类: lock free

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理