gpt4 book ai didi

c++ - 线程中的内存范围共享 : ensure data is not stuck in cache

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:38 26 4
gpt4 key购买 nike

当从一个线程向另一个线程发送内存位置的地址时,如何确保数据不会卡在 CPU 缓存中,并且第二个线程实际读取到正确的值? (我正在使用 socketpair() 发送从一个线程指向另一个线程的指针 )

以及相关问题,C++ 编译器以及线程原语如何找出需要专门处理同步的内存地址。

struct Test { int  fld; }

thread_1 ( ) {
Test *ptr1 = new Test;
ptr1->fld = 100;
::write(write_fd, &ptr1, sizeof(ptr1));
}

thread_2 () {
Test *ptr2;
::read(read_fd, &ptr2, sizeof(ptr2));
// WHAT MAGIC IS REQUIRED TO ENSURE THIS ?
assert(ptr2->fld == 100 );
}

最佳答案

如果你想在同一进程中的线程之间传递值,我会确保 std::atomic<int>作为字段的类型,以及相关的 setter 和 getter 函数。显然,将指针从一个进程传递到另一个进程根本不起作用,除非它来自保证在两个进程中具有相同地址的内存区域 - 例如共享内存,但是你不应该需要套接字。 ..

编译器通常不知道如何处理缓存,atomic 除外。类型(从技术上讲,原子通常使用单独的指令处理,而不是缓存刷新和缓存无效,并且处理器硬件处理相关的“与其他处理器讨论缓存内容”)。

操作系统(当然会出现错误)在进程之间或进程内传递时会执行此类操作。但是对于传递指针,你不能依赖它,新接收到的指针值是正确的,但指针指向的内容不是缓存管理的。

在某些处理器中,您可以使用内存屏障来保证线程间内存内容的正确顺序。这会强制处理器“执行此点之前的所有内存操作”。但是,对于像 read 这样的系统调用和 write ,操作系统应该为你处理,并确保在 read 之前内存已被正确写入开始读取它要存储在套接字缓冲区中的内存,并且 write存储数据后会有内存屏障(在本例中为指针的值,但内存屏障会影响该点之前的所有读取和/或写入)。

如果您要实现自己的原语来传递数据,并且处理器没有缓存一致性(大多数现代处理器都有),您还需要为写入端添加一个缓存刷新,以及一个缓存对阅读方无效。这是依赖于体系结构的,在标准 C 或 C++ 中不支持这一点(在某些处理器中,只有操作系统功能 [内核模式] 可以刷新或使缓存内容无效,在其他处理器中,它可以在用户模式代码中完成 -此类操作的粒度也各不相同,可能需要刷新或使整个缓存系统无效,或者一次可以刷新 32、64 或 128 字节的单独行)

关于c++ - 线程中的内存范围共享 : ensure data is not stuck in cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48416774/

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