0

最近看了leveldb的源码,源码url是https://leveldb.googlecode.com/files/leveldb-1.13.0.tar.gz

当我阅读 db/db_impl.cc 时,会出现以下代码:

mutex_.AssertHeld()

我将它跟踪到文件 port/port_posix.h 中,我发现以下内容:

void AssertHeld() { } 

然后我在源目录中 grep,但再也找不到 AssertHeld() 的任何其他实现。所以这是我的问题,mutex_.AssertHeld() 在 db/db_impl.cc 中做了什么?谢谢

4

1 回答 1

0

正如您所观察到的,它在默认实现中没有任何作用。该函数似乎是一个占位符,用于检查特定线程是否拥有互斥锁,如果没有,则可选择中止。这相当于我们用于变量但应用于互斥锁的正常断言。

我认为它尚未实现的原因是我们没有等效的轻量级函数来断言线程是否在默认实现中使用的 pthread_mutex_t 中持有锁。一些具有该功能的平台可以将此实现作为移植过程的一部分。在网上搜索我确实在leveldb的windows端口中找到了这个功能的一些实现。我可以看到一种使用 pthread_mutex_t 上的包装类来实现它的方法,并设置某种线程 id 变量来指示当前哪些线程持有互斥锁,但考虑到可能出现的竞争条件,它必须小心实现.

于 2013-09-05T06:09:11.233 回答