S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

UNIX上C++程序设计守则(6) [转]

Posted on 2009-02-03 13:39 S.l.e!ep.¢% 阅读(322) 评论(1)  编辑 收藏 引用 所属分类: C++

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: UNIX上C++程序设计守则(6) [转]  回复  更多评论   

2009-02-08 22:29 by 放屁阿狗
为了不谈谈scopelocker和recursion locker , readwrite lock ,这些才是关键的问题
unix上对于stack有很大的限制
对打开文件数量也是很有限制的,比如用root来修改这些限制,等等啦

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