Posted on 2009-02-03 13:39
S.l.e!ep.¢% 阅读(322)
评论(1) 编辑 收藏 引用 所属分类:
C++
UNIX上C++程序设计守则(6)
准则6: 遵守多线程编程的常识
- 要准确把握在POSIX标准的函数中,那些函数是非线程安全的,一定不要使用
- 要让自己编写的函数符合线程安全
- 在访问共享数据/变量之前一定要先锁定
- 如果使用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)-- 补记
线程安全函数是像下面那样
- 不要操作局部的静态变量(函数内的static型的变量)和非局部的静态数据(全局变量)。并且,其它的非线程安全函数不要调用
- 要操作这样的变量的话, 就要使用mutex进行同步处理,来限制多个线程同时对它进行操作
被定义的,但是
- 特别是前者, 和被叫做可重入的(reentrant)函数有区别
- 反之, 后者特别是和叫做"Serializable"(不单单是MT-Safe)"Safe"的函数有区别
也有以上的情况。在Solaris的man手册里, 用后者的方式进行区别. 从多线程程序里安全调用的话,就叫做"Safe", 而且, 在多线程中能够并发(concurrency)地执行这个函数的处理的话,好像就叫做"MT-Safe"。
嗯, 因为比较详细的, 如果不是在对于执行速度要求比较苛刻的环境中编写代码的话, 单单地意识到「是否线程安全」就足够了,不是吗。