相关疑难解决方法(0)

应该使用什么 C++ 构造来访问与另一个进程共享的内存

C++ 代码应该如何访问与另一个应用程序共享的内存,例如通过memmapd 文件?选项似乎是:

  1. 常规原始访问,例如int* p = ...address of shared memory...; *p = 5; *p. 这似乎是不安全的,因为允许编译器假设 的内容p是稳定的,但事实并非如此。
  2. 考虑这些操作的一种方法是它们是另一个进程的输入/输出,因此(至少在旧版本的 C++ 中)应该实现的方式似乎是使用volatile.
  3. 由于现代 C++ 包含内置的原子操作,另一种选择是使用原子。在实践中,编译器似乎并没有对这些操作做太多优化,但不清楚是否被标准禁止。

从实验来看,似乎 2 和 3 都在实践中工作(2 没有正确处理弱记忆的复杂性),但是否符合标准?我是否需要使用组合,即访问atomic<volatile int>

c++ language-lawyer c++14 c++17

5
推荐指数
0
解决办法
93
查看次数

为什么MemoryBarrier可以通过调用xchg来实现?

在msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspx上,MemoryBarrier是作为对xchg的调用来实现的。

// x86

FORCEINLINE
VOID
MemoryBarrier (
    VOID
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}
Run Code Online (Sandbox Code Playgroud)

我在“软件开发人员手册”中找不到一些材料。请告诉我原因。

windows x86 msdn memory-barriers

3
推荐指数
1
解决办法
878
查看次数

在共享内存上使用 volatile 安全吗?

让我们假设如下:

我在 Linux / Mac OS 上有两个进程。

我有mmap共享内存(或在文件中)。

然后在这两个过程中我都有以下内容:

struct Data{
   volatile int reload = 0; // using int because is more standard
   // more things in the future...
};
void *mmap_memory = mmap(...);
Data *data = static_cast<Data *>(mmap_memory); // suppose size is sufficient and all OK
Run Code Online (Sandbox Code Playgroud)

然后在我做的其中一个过程中:

//...
data->reload = 1;
//...
Run Code Online (Sandbox Code Playgroud)

在另一个我做的:

while(...){
    do_some_work();
    //...
    if (data->reload == 1)
        do_reload();
}
Run Code Online (Sandbox Code Playgroud)

这会是线程/进程间安全的吗?

想法来自这里:
https://embeddedartistry.com/blog/2019/03/11/improve-volatile-usage-with-volatile_load-and-volatile_store/

注意:
这对于 来说并不安全std::atomic<>,因为它不“承诺”有关共享内存的任何内容。此外,从两个不同的过程构建/销毁根本不清楚。

c++ volatile shared-memory stdatomic

3
推荐指数
1
解决办法
348
查看次数