我想在两个 Linux 进程之间共享一个 CvMat 对象(OpenCV 库中的矩阵),为此我使用共享内存。一个进程(服务器)将从网络摄像头捕获一帧(矩阵),将其转换为灰度,使用共享内存共享它并在屏幕上显示该帧。另一个进程(客户端)将读取共享帧并执行一些操作。请参阅下面的代码。
问题似乎是客户端没有读取信息,因为“行”和“列”为零(或者服务器没有写入共享内存)。无论如何,我没有收到任何错误消息,我不知道我做错了什么。任何想法?
非常感谢!
这是服务器的代码:
#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include "2cam.h"
int sizeofmat(CvMat *mat) {
return mat->rows * mat->cols * CV_ELEM_SIZE(mat->type);
}
int main() {
int shmid;
key_t key = 5678;
CvMat *vdisp = cvCreateMat(240, 320, CV_8U);
const size_t vdispsize = sizeofmat(vdisp);
CvMat *s = cvCreateMat(240, 320, CV_8U);
CvMat stub;
CvSize imageSize = cvSize(320, 240);
IplImage *color = cvCreateImage(imageSize, 8, 3);
IplImage *gray …Run Code Online (Sandbox Code Playgroud) 我不明白Matlab并行计算工具箱中的parfor cicle如何与内存一起工作:我读到它在所有工作人员之间共享内存(然后我认为每个工作人员(核心)都可以访问感兴趣的内存位置而无需制作本地副本)但是其他参考资料告诉我,每个核心都会在其工作的地方创建内存(变量等)的本地副本!答案是什么?Parfor 有共享内存系统并且不制作数据副本或者每个工作人员都有数据的本地副本?谢谢
parallel-processing matlab memory-management shared-memory parfor
我有两个进程将执行相同的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <pthread.h>
#ifndef _POSIX_THREAD_PROCESS_SHARED
#error This system does not support process shared mutex
#endif
struct shm_content
{
pthread_mutex_t mutex;
};
pthread_mutex_t *mptr; //Mutex Pointer
pthread_mutexattr_t matr; //Mutex Attribute
int shared_mem_id; //shared memory Id
int *mp_shared_mem_ptr; //shared memory ptr -- pointing to mutex
int main (void)
{
int rtn;
size_t shm_size;
/* initialize shared memory segment */
shm_size = 1*sizeof(pthread_mutex_t);
if ((shared_mem_id …Run Code Online (Sandbox Code Playgroud) 我必须从许多进程中访问一组大型且不可选取的 python 对象。因此,我想确保这些对象没有被完全复制。
根据这篇文章和这篇文章中的评论,对象不会被复制(在 UNIX 系统上),除非它们被更改。然而,引用一个对象将会改变它的引用计数,而引用计数又会被复制。
到目前为止这是正确的吗?由于我担心的是大型对象的大小,因此如果复制这些对象的小部分,我不会有问题。
为了确保我正确理解所有内容并且不会发生意外情况,我实现了一个小测试程序:
from multiprocessing import Pool
def f(arg):
print(l, id(l), object.__repr__(l))
l[arg] = -1
print(l, id(l), object.__repr__(l))
def test(n):
global l
l = list(range(n))
with Pool() as pool:
pool.map(f, range(n))
print(l, id(l), object.__repr__(l))
if __name__ == '__main__':
test(5)
Run Code Online (Sandbox Code Playgroud)
在 的第一行中f,我希望id(l)在所有函数调用中返回相同的数字,因为列表在检查之前没有更改id。
另一方面,在 的第三行中f,id(l)应该在每个方法调用中返回不同的数字,因为列表在第二行中发生了更改。
然而,程序的输出让我感到困惑。
[0, 1, 2, 3, 4] 139778408436488 <list object at 0x7f20b261d308>
[-1, 1, 2, 3, 4] 139778408436488 <list …Run Code Online (Sandbox Code Playgroud) 我在 C++ 中有一个 openmp 并行循环,其中所有线程都访问一个共享的 double 数组。
我是否需要原子写入来确保读取的数据有效(旧的或更新的),或者仅当多个线程尝试在同一位置写入时才需要原子写入?
它似乎可以在有或没有原子写入的情况下工作,但如果没有原子写入,当然速度更快。
我正在尝试同步并使一些线程/进程为项目进行通信,并且理想情况下我希望访问它们之间的一些共享内存块,而不会让它们与其他进程/资源发生冲突。
我知道 IPC_PRIVATE 在调用shmget()创建它时会生成一个唯一的密钥,但是如果我随后需要该密钥在其他进程中的某个位置打开该区域,我如何访问该生成的key_t值以便将其发送到其他进程?
我目前正在通过 IPC 消息队列发送数据,因此我可以发送 shmid 值,但据我所知,这不起作用,因为 shmid 值对于每个进程都是唯一的。
我没有其他选择,只能尝试ftok()一些随机文件吗?我是否必须为我想要创建的不同共享内存的每个块选择不同的文件?
感谢您的时间。
让我们假设如下:
我在 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)
这会是线程/进程间安全的吗?
注意:
这对于 来说并不安全std::atomic<>,因为它不“承诺”有关共享内存的任何内容。此外,从两个不同的过程构建/销毁根本不清楚。
我正在使用JEDI插件技术为我的应用程序开发一些插件,但是当它处理数据库连接时,我遇到了许多内存共享问题.主应用程序使用FASTMM4内存管理器.有没有人知道使用插件更简单的框架?
我的目标是创建一个名为SharedMemory的模板单例类,它可以使用boost :: interprocess :: managed_shared_memory将给定的数据结构存储在共享内存中的映射中.
#ifndef SHARED_MEMORY_H_
#define SHARED_MEMORY_H_
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <functional>
#include <string>
#include <utility>
#include <map>
using namespace boost::interprocess;
template<typename T>
class SharedMemory {
typedef std::pair<std::string, T> ValueType;
typedef allocator<ValueType, managed_shared_memory::segment_manager>
ShmemAllocator;
typedef map<std::string, T, std::less<std::string>, ShmemAllocator> SharedMap;
public:
static SharedMemory<T>& instance();
void Create();
void Destory();
void insert(T* t);
std::map<std::string, T> getMapOfRecords();
private:
SharedMemory();
~SharedMemory(){delete m_segment;}
void Initialize();
managed_shared_memory* m_segment;
std::size_t m_size;
};
template<typename T>
inline void SharedMemory<T>::Create() {
Destory();
m_segment = new …Run Code Online (Sandbox Code Playgroud) 这似乎应该很简单,但我找不到任何参考,所以我在这里问.
我有以下CUDA内核,我将在2-D线程块的网格中启动:
__global__ void kernel(){
if (threadIdx.x == 0 && threadIdx.y == 0) {
__shared__ int test = 100;
}
__syncthreads();
// Do more stuff
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到错误"初始化程序不允许共享变量"
我究竟做错了什么?在我看来,我只有一个线程正在进行初始化...
谢谢!