在Linux内核源代码中,有许多内存屏障(smp_mb()等).
但在redis的来源中,我没有看到它.在redis的Makefile中,gcc optimize选项是-O2,所以应该重新排序这些指令.为什么不使用mb()来确保正确的行为?
添加:
例如:在Linux内核的kfifo中:
unsigned int __kfifo_put(struct kfifo *fifo,unsigned char *buffer, unsigned int len)
{
unsigned int l;
len = min(len, fifo->size - fifo->in + fifo->out);
smp_mb();
l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
...
smp_wmb();
fifo->in += len;
...
}
Run Code Online (Sandbox Code Playgroud)
在Redis源代码中,我研究整个项目,找不到内存障碍:例如:
zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj) {
zskiplistNode *update[ZSKIPLIST_MAXLEVEL], *x;
unsigned int rank[ZSKIPLIST_MAXLEVEL];
int i, level;
...
level = zslRandomLevel();
if (level > zsl->level) …Run Code Online (Sandbox Code Playgroud)