ttserver发现的问题,可能是故意这么弄的,如果不是故意的,那就需要我们注意了
查看tt 1.4.46的代码发现加锁的地方是这样写的 if(pthread_rwlock_rdlock((pthread_rwlock_t *)mdb->mmtxs + mi) != 0) return NULL; 这句话放在了读接口那里,可见如果加锁失败就拿不到数了,
写数据的接口也是这个写法,
bool tcmdbputproc(TCMDB *mdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz,
TCPDPROC proc, void *op){
assert(mdb && kbuf && ksiz >= 0 && proc);
unsigned int mi;
TCMDBHASH(mi, kbuf, ksiz);
if(pthread_rwlock_wrlock((pthread_rwlock_t *)mdb->mmtxs + mi) != 0) return false;
bool rv = tcmapputproc(mdb->maps[mi], kbuf, ksiz, vbuf, vsiz, proc, op);
pthread_rwlock_unlock((pthread_rwlock_t *)mdb->mmtxs + mi);
return rv;
}
所以写数据也可能不知原因的写入失败。但是这样有个好处就是看上去快
不知道作者出于什么目的