VC 粉丝

关于线程安全的文章

如果说一个函数或者一个类是线程平安的,究竟代表什么意思呢?
我的第一反应是,在针对共享数据的访问上加锁。不过那篇文章
举了几个例子,很有意思。
第一,假设有一个行列,客户代码如下:
if(q->hasData()) Console.write(q->getFirstData());
GetFirstData是线程平安的,在针对行列数据访问的时候,queue进行了互斥。
但是以上的代码却不是线程平安的,如果在if成立往后,行列中的数据被其他线程
根除,那第二句调用就可能不合法了,比如getFirstData或许会搞一个异常出来。

第二,那就应当改成在getFirstData里自己判断是否有数据,把判断和取数据合并。
data = q->checkAndGetFirstData();
if(data)
Console.write(data);
这样起码不会有异常了。不过即使这样,还是有问题。这里的数据被复制到了data
上,如果write的时候行列中的数据被其他线程修改了,那这里打印出来的就不是
行列那时的真实数据。

只能再狠一点,
q->checkAndGetFirstDataThenExec(Console.write());
姑且无论这样写语法是否正常,总之这次是没问题了。

总结起来,其实线程平安是有差异的程度的。上面的三个例子,其实就是加锁的时间越来越长,
所以效率也在降低。

Python有一个著名的全局线程锁,导致Python里的多线程其实就是单线程,就是这种设计思路的
极致推广了。所以如果想用Python的多线程实现IO操作的并发,结果会很灰心。

posted on 2009-10-23 10:04  VC 粉丝  阅读(442)  评论(0编辑  收藏  举报

导航