{技术}多线程程序中操作的原子性

164 views
Skip to first unread message

Guancheng Chen

unread,
Apr 15, 2010, 5:54:45 PM4/15/10
to TopLanguage
在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多
线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操
作?

http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithreaded-application/

请多多指教!

--
Guancheng Chen
Blog: http://www.parallellabs.com
Twitter: @guancheng

woo

unread,
Apr 15, 2010, 11:06:44 PM4/15/10
to pon...@googlegroups.com
挺好的,顶一下
随便说一下,个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的
这点C/C++都做得很失败,让我们码工不能把精力集中在代码实现上,反而要搞一些小trick来处理各种同步的问题
看看C/C++里面各种各样实现的lock-free ....
> --
> To unsubscribe, reply using "remove me" as the subject.

chuang

unread,
Apr 15, 2010, 11:18:29 PM4/15/10
to pon...@googlegroups.com
"个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的"

顶这句话.语言本来就该屏蔽一些与系统相关的东西,要不然要个语言层面的中间层意义不太大了.

2010/4/16 woo <woos...@gmail.com>

oliver yang

unread,
Apr 15, 2010, 11:44:07 PM4/15/10
to pon...@googlegroups.com
在 2010年4月16日 上午11:18,chuang <lichua...@gmail.com> 写道:
> "个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的"
> 顶这句话.语言本来就该屏蔽一些与系统相关的东西,要不然要个语言层面的中间层意义不太大了.


这个非常的不现实,所谓原子操作的代价是很大的,对SMP系统性能的影响很大,如果语言来处理这个,那这个语言在多核系统上性能会很糟糕。


>
> 2010/4/16 woo <woos...@gmail.com>
>>
>> 挺好的,顶一下
>> 随便说一下,个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的
>> 这点C/C++都做得很失败,让我们码工不能把精力集中在代码实现上,反而要搞一些小trick来处理各种同步的问题
>> 看看C/C++里面各种各样实现的lock-free ....
>>
>> On 14:54 Thu 15 Apr     , Guancheng Chen wrote:
>> > 在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多
>> > 线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操
>> > 作?
>> >
>> >
>> > http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithreaded-application/
>> >
>> > 请多多指教!
>> >
>> > --
>> > Guancheng Chen
>> > Blog: http://www.parallellabs.com
>> > Twitter: @guancheng
>> >
>> > --
>> > To unsubscribe, reply using "remove me" as the subject.
>>
>
>

--
Cheers,

Oliver Yang

Twitter: http://twitter.com/yangoliver
Blog: http://blog.csdn.net/yayong
--------------------------------------------------------------------
An OpenSolaris Developer

jigsaw

unread,
Apr 16, 2010, 2:21:48 AM4/16/10
to pon...@googlegroups.com
Basically all atomic/lock-free operations/algorithms resort to ll/sc or compare-and-swap. 
And ll/sc is much stronger than cas coz ll/sc doesn't have ABA problem at all.
Meantime, ll/sc is more likely to fail than cas.

And it's programmer's responsibility to assure alignment.
Alignment is so important that it may leads to more than one instructions for reading just one word - if that word is not aligned well.


2010/4/16 Guancheng Chen <chengu...@gmail.com>

Guancheng Chen

unread,
Apr 16, 2010, 2:26:55 AM4/16/10
to TopLanguage
C++0x中要引入的atomic type/operations应该是轻量级的操作吧。原因是标准委员会认为C++是一门系统语言,C++应该能提
供接近机器层的访问方法。这样在需要的时候就能用来实现诸如lock free data structure之类。不知道您指的代价很大的原子操作
是?

On 4月16日, 上午5时44分, oliver yang <yangoli...@gmail.com> wrote:


> 在 2010年4月16日 上午11:18,chuang <lichuang1...@gmail.com> 写道:
>
> > "个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的"
> > 顶这句话.语言本来就该屏蔽一些与系统相关的东西,要不然要个语言层面的中间层意义不太大了.
>
> 这个非常的不现实,所谓原子操作的代价是很大的,对SMP系统性能的影响很大,如果语言来处理这个,那这个语言在多核系统上性能会很糟糕。
>
>
>
>
>
>
>

> > 2010/4/16 woo <woosi...@gmail.com>


>
> >> 挺好的,顶一下
> >> 随便说一下,个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的
> >> 这点C/C++都做得很失败,让我们码工不能把精力集中在代码实现上,反而要搞一些小trick来处理各种同步的问题
> >> 看看C/C++里面各种各样实现的lock-free ....
>
> >> On 14:54 Thu 15 Apr , Guancheng Chen wrote:
> >> > 在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多
> >> > 线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操
> >> > 作?
>

> >> >http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithrea...

oliver yang

unread,
Apr 16, 2010, 2:40:01 AM4/16/10
to pon...@googlegroups.com
在 2010年4月16日 下午2:26,Guancheng Chen <chengu...@gmail.com> 写道:
> C++0x中要引入的atomic type/operations应该是轻量级的操作吧。原因是标准委员会认为C++是一门系统语言,C++应该能提
> 供接近机器层的访问方法。这样在需要的时候就能用来实现诸如lock free data structure之类。不知道您指的代价很大的原子操作
> 是?

奥,是我弄错了。我误解了语言提供原子操作的含义。


原子操作指令都会对CPU pipeline的性能有影响,所以当然能不用就不用。

Walkley He

unread,
Apr 16, 2010, 2:44:03 AM4/16/10
to pon...@googlegroups.com
But there's no LL/SC instructions in X86

2010/4/16 jigsaw <jig...@gmail.com>:

woo

unread,
Apr 16, 2010, 2:50:47 AM4/16/10
to pon...@googlegroups.com
java 有了,C++ 0x也快有了
go也有了
对于不同的系统,可以做不同的编译器,编译同一段代码。而不是写无数的#ifdef
x86来适应不同的平台。

jigsaw

unread,
Apr 16, 2010, 2:56:50 AM4/16/10
to pon...@googlegroups.com
True. But it's not my problem. =D
However, I won't assume ll/sc while programming locklessly.


2010/4/16 Walkley He <walk...@gmail.com>

Eric.Wang

unread,
Apr 16, 2010, 4:04:08 AM4/16/10
to TopLanguage

原子操作是由语言还是由库来提供,见仁见智。从灵活性来说,原子操作是应该由库来提供的,这样语言才能适应广泛的领域。

实际上我没见过那个语言是在语言层面提供所有的原子操作的。

java的synchronized(obj),或者C#的lock(obj),都不过是语法糖,都是利用object的lock方法。

线程同步,总是通过语言的代码来实现的。没有所谓语言层面的原子操作。

int、float的赋值我们说是原子的,但这不是语言的特性,而是x86硬件的特性。

On Apr 16, 11:06 am, woo <woosi...@gmail.com> wrote:
> 挺好的,顶一下
> 随便说一下,个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的
> 这点C/C++都做得很失败,让我们码工不能把精力集中在代码实现上,反而要搞一些小trick来处理各种同步的问题
> 看看C/C++里面各种各样实现的lock-free ....
>
> On 14:54 Thu 15 Apr , Guancheng Chen wrote:
>
> > 在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多
> > 线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操
> > 作?
>

> >http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithrea...

Yingjie XU

unread,
Apr 16, 2010, 4:18:57 AM4/16/10
to pongba
在语言层面提供原子操作,非常重要的是指这个语言的内存模型。

2010/4/16 Eric.Wang <wangsh...@gmail.com>



--
Yingjie XU
Département d'informatique
École Normale Supérieure
45 rue d'Ulm
F-75230 Paris Cedex 05

"If you received this communication by mistake,
please don't forward it to anyone else (it may contain
confidential or privileged information), please erase
all copies of it, including all attachments, and please
let the sender know it went to the wrong person.
Thanks."

chen yang

unread,
May 14, 2010, 10:28:29 AM5/14/10
to pon...@googlegroups.com
如果把原子操作作为语言的特性,那么就有如下问题:
1,对于那些不需要并发的代码(其实这类程序更多),有可能会付出时间和空间上的开销。
2,如果操作系统提供的并发设施和语言定义不一致,那对于平台的开发者将是一个痛苦。

当然对于java这样的语言,性能本来就不是重点,自然就可以提供统一的并发支持。对于c/c++这样的系统语言,提供语言级并发支持就不一定是最佳选择了。

2010/4/16 Yingjie XU <jdkl...@gmail.com>

archer

unread,
May 18, 2010, 9:28:31 PM5/18/10
to pon...@googlegroups.com
Java也是在库上提供主要的并发支持的,比如java.util.concurrent。一些原子操作,也是在java.util.concurrent.atomic里面提供的。提不提供语言级并发,我觉得关键是语言的设计目标。通用语言,我想不合适在语言级提供,原因 楼上很多兄弟都说了。


2010/5/14 chen yang <mike....@gmail.com>

Devil Wang

unread,
May 19, 2010, 4:14:11 AM5/19/10
to pon...@googlegroups.com


2010/4/16 woo <woos...@gmail.com>

挺好的,顶一下
随便说一下,个人以为原子操作应该是语言本身应该提供的feature,而不是用库来实现的
这点C/C++都做得很失败,让我们码工不能把精力集中在代码实现上,反而要搞一些小trick来处理各种同步的问题
看看C/C++里面各种各样实现的lock-free ....

feature加进去了,效率就低了。

有的语言必须是以效率优先的。比如C/C++

有的语言是以应用优先的,如如java, (似乎底层有是C/C++的)

侧重点不一样而已。 你看到有人用java去写网关扫描的? 

你有看到有人C++去写web的?
 

On 14:54 Thu 15 Apr     , Guancheng Chen wrote:
> 在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多
> 线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操
> 作?
>
> http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithreaded-application/
>
> 请多多指教!
>
> --
> Guancheng Chen
> Blog: http://www.parallellabs.com
> Twitter: @guancheng
>
> --
> To unsubscribe, reply using "remove me" as the subject.




--
Thanks & Regards

Linux Developer : Devil Wang
Reply all
Reply to author
Forward
0 new messages