<Ev********@goo glemail.comwrot e in message
news:11******** *************@n 76g2000hsh.goog legroups.com...
In the stuff I've read about multi threaded singleton it seems to
assume that creating the Lock is atomic, and various sources,
including Sutter go for RAII.
There is a solution for a thread-safe version of that here:
http://groups.google.com/group/comp....da701564880ab4 http://appcore.home.comcast.net/vzdo...c/static-init/ http://appcore.home.comcast.net/vzoom/refcount/
You use a hashed-mutex/spinlock scheme to handle atomic lock
construction/destruction. e.g.:
// Details
#define DETAIL_CONCATX( __t1, __t2)__t1##__t2
#define DETAIL_CONCAT(_ _t1, __t2)CONCATX(__ t1, __t2)
#define DETAIL_HASHMUTE X_8(__init)\
__init, __init, __init, __init, __init, __init, __init, __init
#define DETAIL_HASHMUTE X_32(__init)\
DETAIL_HASHMUTE X_8(__init), DETAIL_HASHMUTE X_8(__init),\
DETAIL_HASHMUTE X_8(__init), DETAIL_HASHMUTE X_8(__init)
#define DETAIL_HASHMUTE X_128(__init)\
DETAIL_HASHMUTE X_32(__init), DETAIL_HASHMUTE X_32(__init),\
DETAIL_HASHMUTE X_32(__init), DETAIL_HASHMUTE X_32(__init)
#define DETAIL_HASHMUTE X_256(__init)\
DETAIL_HASHMUTE X_128(__init), DETAIL_HASHMUTE X_128(__init)
#define DETAIL_HASHMUTE X_512(__init)\
DETAIL_HASHMUTE X_256(__init), DETAIL_HASHMUTE X_256(__init)
#define DETAIL_HASHMUTE X_CONCAT(__init , __count)\
DETAIL_CONCAT(D ETAIL_HASHMUTEX _, __count)(__init )
// Impl
#include <pthread.h>
#define HASHMUTEX_DEPTH () 256
#define HASHMUTEX_INITI ALIZER() PTHREAD_MUTEX_I NITIALIZER
#define HASHMUTEX_PTR(_ _ptr) (((int)__ptr) % HASHMUTEX_DEPTH ())
#define HASHMUTEX_STATI CINIT() {\
DETAIL_HASHMUTE X_CONCAT(HASHMU TEX_INITIALIZER (), HASHMUTEX_DEPTH ())\
}
// hashed-mutex table
static pthread_mutex_t hashmutex_table[
HASHMUTEX_DEPTH ()
] = HASHMUTEX_STATI CINIT();
static int hashmutex_lock( void* const ptr) {
return pthread_mutex_l ock(&hashmutex_ table[HASHMUTEX_PTR(p tr)]);
}
static int hashmutex_trylo ck(void* const ptr) {
return pthread_mutex_t rylock(&hashmut ex_table[HASHMUTEX_PTR(p tr)]);
}
static int hashmutex_unloc k(void* const ptr) {
return pthread_mutex_u nlock(&hashmute x_table[HASHMUTEX_PTR(p tr)]);
}
class A {};
class B {};
static A g_a;
static B g_b;
int main() {
// lock & unlock a
hashmutex_lock( &g_a);
// ...
hashmutex_unloc k(&g_a);
// lock & unlock b
hashmutex_lock( &g_b);
// ...
hashmutex_unloc k(&g_b);
return 0;
}
Got to watch out for deadlocks... Here is one possible solution:
http://groups.google.com/group/comp....011baf08844c4/
Any thoughts?
:^)