桃源谷

心灵的旅行

人生就是一场旅行,不在乎旅行的目的地,在乎的是沿途的风景和看风景的心情 !
posts - 32, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

准则6:遵守多线程编程的常识(下)

Posted on 2009-02-01 15:41 lymons 阅读(1359) 评论(1)  编辑 收藏 引用 所属分类: C++CUnix/Linux文章翻译
From 2008精选

UNIX上C++程序设计守则(6)Add star

准则6: 遵守多线程编程的常识


  1. 要准确把握在POSIX标准的函数中,那些函数是非线程安全的,一定不要使用
  2. 要让自己编写的函数符合线程安全
    • 在访问共享数据/变量之前一定要先锁定
    • 如果使用C++的话,一定要注意函数的同步方法

说明: (2) 要让自己编写的函数符合线程安全


在写多线程的应用程序时,在多个线程里共享的变量要先锁定然后在更新它.。那么在多线程里共享的变量主要有全局变量和函数内的静态变量。而且,即使是short型和int型的共享变量也要先锁定后更新才能保证其安全。


※ 详细的是参考 id:yupo5656:20040618 "[C++] 多线程和共享变量"


还有,在使用C++编程的场合要注意函数的方步方法。一般的说来下面的写法是错误的。Mutex在函数内被声明成静态变量是不允许的

int incr_counter(void) {
static Mutex m; // 这么写不行
m.Lock();

static int counter = 0;
int ret = ++counter;

m.Unlock();
return ret;
}

应该用下面的方式来代替,

Mutex m;

int incr_counter(void) {
m.Lock();
// ...

把Mutex声明成全局变量的话比较好(稍微比上一个好)。


※ 详细是参考 id:yupo5656:20040713 "[C++] C++中写出synchronized method比较难" 。


UNIX上C++程序设计守则(6)-- 补记Add Star

线程安全函数是像下面那样

  1. 不要操作局部的静态变量(函数内的static型的变量)和非局部的静态数据(全局变量)。并且,其它的非线程安全函数不要调用
  2. 要操作这样的变量的话, 就要使用mutex进行同步处理,来限制多个线程同时对它进行操作

被定义的,但是

  • 特别是前者, 和被叫做可重入的(reentrant)函数有区别
  • 反之, 后者特别是和叫做"Serializable"(不单单是MT-Safe)"Safe"的函数有区别

也有以上的情况。在Solaris的man手册里, 用后者的方式进行区别. 从多线程程序里安全调用的话,就叫做"Safe", 而且, 在多线程中能够并发(concurrency)地执行这个函数的处理的话,好像就叫做"MT-Safe"。

 

嗯, 因为比较详细的, 如果不是在对于执行速度要求比较苛刻的环境中编写代码的话, 单单地意识到「是否线程安全」就足够了,不是吗。

Feedback

# re: 准则6:遵守多线程编程的常识(下)  回复  更多评论   

2010-06-21 16:28 by martyrolatr
博主能否详细解释下为何
Mutex在函数内被声明成静态变量是不允许的
我使用过boost::mutex没有发现问题。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


我的个人简历第一页 我的个人简历第二页