关于线程安全的个人理解
时间:2010-06-19 来源:saltedLinux
关于线程安全,本人有以下理解:
1)一个线程即是启动一个线程函数,然后一直运行直至退出。如果该函数被同时启动多次,那么就涉及到线程安全问题。如果是不同的线程函数被启动,则涉及到线程间数据共享互斥的问题,而非线程安全的概念。
2)线程安全”不是说一个线程是安全的,而是说一个处理过程是“线程安全”的,即该处理过程可以在多线程并发时正常工作。
3)STL应该应该不是线程安全的,因为凡是线程安全的过程都是以牺牲性能为代价的。
4)线程安全有点可重入的意思,但是安全不仅仅是可冲入。
可重入函数要解决的问题是,不在函数内部使用静态或全局数据,不返回静态或全局数据,也不调用不可重入函数。 线程安全函数要解决的问题是多个线程调用同一函数时访问资源冲突。
5)singleton模式中线程安全的讨论
模式一:
class Singleton {
private: Singleton(){}
public:
static Singleton instance;
static Singleton2 getInstance() {
if(instance==null)
{
instance=new Singleton();
return instance;
} }; //这种情况是两个线程就无限制的进到这个位置,自然两个线程如果同时到达这里,都执行判断 //instance==null为true,
//就可以进入去执行instance=new Singleton();,这时就new了两个对象出来,因为都是赋给 //instance,自然有一个被后面new的覆盖,当然内存中就有一个垃圾对象了,
不用说,大家也知道,这种在单线程程序中是没什么问题的,但多线程程序中,则可能会创建出2个或多个对象.
模式二:
public class Singleton {
private: Singleton(){}
static Singleton instance =new Singleton();
public: static Singleton getInstance(){
return instance;
}
};
这种很显然没有前者的问题,也是值得推崇的方式.
模式三:
public class Singleton {
private: static class SingletonHolder {
static Singleton instance = new Singleton();
}
public: static Singleton getInstance() {
return SingletonHolder.instance;
}
};
private: Singleton(){}
public:
static Singleton instance;
static Singleton2 getInstance() {
if(instance==null)
{
instance=new Singleton();
return instance;
} }; //这种情况是两个线程就无限制的进到这个位置,自然两个线程如果同时到达这里,都执行判断 //instance==null为true,
//就可以进入去执行instance=new Singleton();,这时就new了两个对象出来,因为都是赋给 //instance,自然有一个被后面new的覆盖,当然内存中就有一个垃圾对象了,
不用说,大家也知道,这种在单线程程序中是没什么问题的,但多线程程序中,则可能会创建出2个或多个对象.
模式二:
public class Singleton {
private: Singleton(){}
static Singleton instance =new Singleton();
public: static Singleton getInstance(){
return instance;
}
};
这种很显然没有前者的问题,也是值得推崇的方式.
模式三:
public class Singleton {
private: static class SingletonHolder {
static Singleton instance = new Singleton();
}
public: static Singleton getInstance() {
return SingletonHolder.instance;
}
};
相关阅读 更多 +