background image

s_instance.reset(new T);
return s_instance.get();
}

    另外考虑到在多线程下对 static 单例对象进行操作,会出现并发访问同步的问题,所以这
里使用了读写互斥锁来进行

set(设置数据)的同步。如下:

[cpp]
#ifndef _RWLOCK_H_
#define _RWLOCK_H_

#define LOCK(q) while (__sync_lock_test_and_set(&(q)->lock,1)) {}
#define UNLOCK(q) __sync_lock_release(&(q)->lock);

struct rwlock {
int write;
int read;
};

static inline void
rwlock_init(struct rwlock *lock) {
lock->write = 0;
lock->read = 0;
}

static inline void
rwlock_rlock(struct rwlock *lock) {
for (;;) {//不断循环,直到对读计数器累加成功
while(lock->write) {
__sync_synchronize();
}
__sync_add_and_fetch(&lock->read,1);
if (lock->write) {//当已是写锁时,则去掉读锁记数器
__sync_sub_and_fetch(&lock->read,1);
} else {
break;
}
}
}

static inline void
rwlock_wlock(struct rwlock *lock) {
__sync_lock_test_and_set(&lock->write,1);
while(lock->read) {