gpt4 book ai didi

c - 为什么在 Redis 源代码中我没有看到内存屏障?

转载 作者:IT王子 更新时间:2023-10-29 06:02:59 24 4
gpt4 key购买 nike

在Linux内核源代码中,有很多内存屏障(smp_mb()等)。

但是在redis的源码里,我没有看到。在redis的Makefile中,gcc优化选项是-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;
...
}

在 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) {
for (i = zsl->level; i < level; i++) {
rank[i] = 0;
update[i] = zsl->header;
/////need a mb() ???
update[i]->level[i].span = zsl->length;
}
zsl->level = level;
}
...
}

为什么在redis中没有内存屏障是不是很特别?
我认为可能是我对 mb() 的理解不成熟,感谢评论...

添加:

但在上面显示的两段代码中,linux 内核中的 kfifo 使用了 mb()。它只是更改线程堆栈空间中分配的变量以及 r/w 操作之间的用户 mb() 。所以它不应该完全与多线程相关......(虽然redis是单线程)

最佳答案

Redis 是单线程的,因此不需要内存屏障。

它们仅在您有多个执行路径时才相关(例如,在多线程应用程序中)。即使是多线程用户空间应用程序,您通常也不需要自己的内存屏障,因为库(例如 pthreads)在同步 API(例如互斥体、信号量、条件变量等)中包含内存屏障。

关于c - 为什么在 Redis 源代码中我没有看到内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com