问题标签 [shared-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
23969 浏览

posix - Posix 共享内存与映射文件

对这个主题有所了解后,任何人都可以说出 POSIX 共享内存 (shm_open) 和 POSIX 映射文件 (mmap) 之间的真正区别是什么?

两者似乎都使用 /dev/tmpfs 子系统,而不是旧的 IPC 机制。

那么使用 mmap 文件而不是共享内存有什么优势吗?

谢谢。

0 投票
2 回答
546 浏览

c++ - 静态内存中的 STL 结构跨线程“丢失”数据

我正在使用 pthreads 编写一个多线程演示程序,其中一个线程将数据加载到 STL 队列中,另一个线程从中读取。听起来微不足道,对吧?不幸的是,推入队列的数据正在消失。我对多线程并不陌生,也不熟悉内存结构——然而,这让我很困惑。

这些是我对队列本身和保护它的互斥体的声明,它们位于客户端代码包含的标头中:

当程序启动时,它使用进程共享属性初始化互斥锁:

然后它启动“生产者”线程和“消费者”线程,让他们做自己的事情。生产者线程将一个新项目推入队列,然后进入睡眠状态。以下是它向队列添加内容的行:

然后它休眠并让消费者线程接管。但是,当消费者线程检查队列中的项目时,队列神奇地是空的。

我已经使用 gdb 逐步完成了该程序。下面是我运行的输出。你可以看到生产者在哪里添加了一些东西到队列中,我打印队列的大小以确保它在那里,有一个上下文切换到消费者线程,我再次打印队列的大小,它是空的。一探究竟:

所以,我真的不确定发生了什么。队列只能在关键部分(读/写)中访问,队列是静态的,并且标头是 if-def'd 以不被多重包含。

我很感激任何人都可以提供的帮助!

0 投票
1 回答
791 浏览

openmp - 英特尔 Cluster OpenMP 的类似物

有英特尔 Cluster OpenMP 的类似物吗?该库模拟共享内存机器(如 SMP 或 NUMA),同时在分布式内存机器(如以太网连接的 PC 集群)上运行。

该库允许直接在集群上启动 openmp 程序。

我寻找

  • 允许多线程程序在分布式集群上运行的库
  • 或库(替换例如 libgomp),允许 OpenMP 程序在分布式集群上运行
  • 或编译器,能够从 openmp 程序生成集群代码,除了 Intel C++
0 投票
2 回答
2210 浏览

c++ - boost.interprocess 中共享内存的 memcpy 问题

这让我感到沮丧。我只是想创建一个共享内存缓冲区类,该类在通过 Boost.Interprocess 创建的共享内存中使用,我可以在其中读取/存储数据。我写了以下内容来测试功能

当我运行它时,它写入数据正常,但memcpy在读取循环中的第一个出现段错误。gdb 说:

程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因:KERN_INVALID_ADDRESS 在地址:0x0000000000000000 0x00007fffffe007c5 in __memcpy()

(gdb) 在哪里

#0 0x00007fffffe007c5 in __memcpy () #1 0x0000000100000e45 in main (argc=1, argv=0x7fff5fbff9d0) at try.cpp:36

功能如此简单,我不知道我错过了什么。任何帮助都感激不尽。

0 投票
4 回答
273 浏览

python - Python:使用 os.fork 更好的文件 I/0?

我的问题很简单:我有一个 400MB 的文件,里面有 10,000,000 行数据。我需要遍历每一行,做一些事情,然后从内存中删除该行以避免填充过多的 RAM。

由于我的机器有几个处理器,我优化这个过程的最初想法是创建两个不同的进程。可以一次读取文件几行并逐渐填充一个列表(列表的一个元素是文件中的一行)。另一个将有权访问这个相同的列表,并将 pop() 元素从中取出并处理它们。这将有效地创建一个从一侧增长并从另一侧收缩的列表。

换句话说,这种机制应该实现一个缓冲区,该缓冲区将不断地填充行以供第二个进程处理。但也许这并不比使用更快:

0 投票
3 回答
23673 浏览

c++ - 如果在共享内存中,pthread 互斥锁是否可以跨线程工作?

我找到了这个: 快速进程间同步方法

我曾经相信一个 pthread 互斥锁只能在同一个线程中的两个线程之间共享地址空间中的两个线程之间共享。

那里的问题/答案似乎暗示:

如果我有两个单独的进程 A 和 B。它们有一个共享内存区域 M。我可以在 M 中放置一个 pThread 互斥体,锁定 A,锁定 B,解锁 A;并且 B 将不再阻塞互斥锁。这个对吗?pThread 互斥锁可以在两个单独的进程中共享吗?

编辑:我在 MacOSX 上使用 C++。

0 投票
1 回答
605 浏览

c++ - 在 C/++ 上的只读共享内存中具有输入图的图算法 (lib)

我希望有一个管理器进程通过共享内存共享图,对于将在这些图上运行各种图算法的其他进程是只读的。我想问一些在研究这个问题时出现的问题:

  • 是否有任何图形库能够在只读 shm 中操作(可能是它们自己的)图形结构?也就是说,算法需要将它们的工作区和结果缓冲区放在本地进程内存中,并且不使用在图形结构中声明的任何缓冲区。

  • 我知道有两个著名的库是igraphBoost。对前者的C接口了解不多,也没有用过Boost。在这个主题上有什么经验(关于 shm 兼容性)?

  • 在查看 Boost 文档时,我看到有一个支持 shm 的 Boost.Interprocess 包。

    • 起初我考虑使用手动制作的 shm 和 mmapped shm(Linux 平台)。Boost 是否优于并推荐这种方法?
    • Boost Graph 库与手动 shm 或 Interprocess 一起玩得好吗?

除了对这些问题的见解之外,我很高兴阅读您在图形处理和共享内存方面的经验。谢谢!

0 投票
2 回答
2339 浏览

linux - 通过 sys/shm.h 共享多个变量

我正在尝试使用 shm.h 库使用一个共享内存块来共享两个不同的。我编写了以下示例,其中创建了一个共享内存块,并且大到足以容纳两个整数。然后我将两个整数附加到它并创建两个进程。第一个过程递增第一个整数。然后第二个过程打印出两个整数的值。但是发生的情况是两个整数都增加了。

我究竟做错了什么?我刚开始学习如何使用 shm 库。

这是代码:

这是输出:

我在 Gentoo Linux 上运行它。

0 投票
1 回答
762 浏览

c# - 是否可以通过内存映射文件将实例“指针”传递给另一个进程?

我基本上是在寻找一种在.NET 4.0 中跨程序/进程传递实例而不序列化实例的方法。

是的,我错过了我的 100% 不安全指针;)

我认为将内存映射文件与 .NET 4.0 的新集成会对我有所帮助,因为在某处阅读了可以使用它“本地”传递引用/指针的内容。

但是,当我尝试类似

我得到以下参数异常:

是否可以使用 MMF 传递引用?如果不是,有没有办法程序/进程周围传递实例?

0 投票
2 回答
2571 浏览

c++ - 将分配器添加到 C++ 类模板以创建共享内存对象

简而言之,我的问题是:如果你有类,MyClass<T>你怎么能改变类定义来支持你有的情况MyClass<T, Alloc>,类似于 STL 向量提供的方式。

我需要这个功能来支持共享内存的分配器。具体来说,我正在尝试在共享内存中实现一个环形缓冲区。目前它有以下ctor:

其中ItemType是要放置在缓冲区每个槽中的数据的类型。

现在,当我从主程序创建缓冲区时,这非常有用

但是,在这种情况下,缓冲区本身不是在共享内存中创建的,因此其他进程无法访问。我想做的是能够做类似的事情

但是,我不知道如何将显式分配器添加到类模板中。