多线程安全性
多线程编程离不开锁,可加锁会引起性能,甚至是死锁,那到底什么是多线程安全的?
{int local1;
++local1;} 是安全的
比如
i =10; //thread1
i=4; //thread2
不会导致i的值处于未知状态,要么是10要么是4
++这个操作其实分为两部,一个是读,另外一个是写
mov ecx,global
add ecx,1
mov global,ecx
假设 struct T
T* global_t;
T* nt = new T;
T* temp = & global_t;
do{
memcpy(nt, global_t, sizeof(T));
//修改
}while(!CAS(&global_t, temp, nt)); CAS 可以用 xchgcmp 指令来实现
volatile仅仅是告诫compiler不要对这个变量作优化,每次都要从memory取数值,而不是从register
著名的Meyer Singleton其实不是线程安全的
Object & getInstance()
{
static Object o;
return o;
}
可能会造成多次初始化对象
写好多线程安全的法宝就是封装,使数据有保护的被访问到
安全性:局部变量>成员变量>全局变量

浙公网安备 33010602011771号