Posted on 2009-02-03 13:39 
S.l.e!ep.¢% 阅读(331) 
评论(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"。
		 
		嗯, 因为比较详细的, 如果不是在对于执行速度要求比较苛刻的环境中编写代码的话, 单单地意识到「是否线程安全」就足够了,不是吗。