免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1765 | 回复: 6
打印 上一主题 下一主题

请教一个线程安全问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-19 21:41 |只看该作者 |倒序浏览
我们都知道,局部静态变量不是线程安全的,因为它可以被多个线程访问到。

我听说可以用类来代替局部静态变量,实现线程安全,请问具体是怎么实现的呢?哪位大侠可以给出原理或者实例吗?

论坛徽章:
0
2 [报告]
发表于 2007-02-20 09:56 |只看该作者
所谓局部静态变量不是线程安全,一个是初始化的问题(可能被多次初始化),还有一个问题就是线程之间同步。
这个问题可以用设立互斥区,双检测技术来解决。具体请看Singleton模式,我想你所说的用类来解决大概是指的这个意思。
代码大概是这个样子

  1. class single
  2. {
  3. public:
  4.    static single* getInstance()
  5.    {
  6.       if (m_pInstance == NULL)
  7.       {
  8.            lock();
  9.            if (m_pInstance != NULL)
  10.            {
  11.                m_pInstance = new single();
  12.            }
  13.            unlock();
  14.       }
  15.       return m_pInstance;
  16.     }
  17. private:
  18.    static single* m_pInstance;
  19. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-02-20 10:00 |只看该作者
原帖由 nokuta 于 2007-2-19 21:41 发表
我们都知道,局部静态变量不是线程安全的,因为它可以被多个线程访问到。

我听说可以用类来代替局部静态变量,实现线程安全,请问具体是怎么实现的呢?哪位大侠可以给出原理或者实例吗?


不清楚具体要做什么?

论坛徽章:
0
4 [报告]
发表于 2007-02-21 15:34 |只看该作者
ISO C++98,对线程安全没有任何的规定。所以,用传统的C代码解决不了的问题,用类仍然是解决不了。
不过好像是C++0X里,有专门的线程安全部分。可以实现部分的线程安全。

论坛徽章:
0
5 [报告]
发表于 2007-02-22 18:09 |只看该作者
通过语言自有的机制来解决这个问题,那不是C的风格。
此类问题的解决应该独立于语言,让库来解决。

另,二楼请参考pthread_once(3)

论坛徽章:
0
6 [报告]
发表于 2007-02-23 10:37 |只看该作者
Posix线程库是使用互斥锁和条件变量保证由pthread_once()指定的函数执行且仅执行一次。
这个可以保证初始化操作只进行一次,同样也是使用互斥锁和条件来实现的。线程间的同步还需要自己解决。

根本的不同大概在与我在2楼的代码是基于c++。
请johnbull老大指正。

论坛徽章:
0
7 [报告]
发表于 2007-02-23 22:04 |只看该作者
加锁
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP