[英]How to mmap Eigen into shared memory?
I want to use Eigen
library as my shared memory data structure (by mmap
).我想使用
Eigen
库作为我共享的 memory 数据结构(通过mmap
)。
here is my code:这是我的代码:
producer.cpp:生产者.cpp:
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include <vector>
#include <iostream>
#include <string>
#include "eigen3/Eigen/Dense"
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> eigen_matrix;
using namespace std;
int main(int argc,char **argv) {
int fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0777);
size_t size = 100 * 100 * sizeof(typename eigen_matrix::Scalar);
lseek(fd, size, SEEK_SET);
write(fd,"",1);
eigen_matrix* p =(eigen_matrix*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
p->resize(100, 100);
(*p)(0, 0) = 1;
double s;
size_t count = 0;
while (std::cin >> s && s != 0) {
(*p)(count++, 0) = s;
}
printf("initialize over\n");
munmap(p, size);
close(fd);
}
consumer.cpp:消费者.cpp:
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include <vector>
#include <iostream>
#include <string>
#include "eigen3/Eigen/Dense"
using namespace std;
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> eigen_matrix;
int main(int argc,char **argv) {
int fd = open(argv[1], O_RDWR, 0777);
size_t size = 100 * 100 * sizeof(typename eigen_matrix::Scalar);
lseek(fd, size, SEEK_SET);
eigen_matrix* p = (eigen_matrix*)mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
close(fd);
printf("%zu %zu\n", p->cols(), p->rows());
cout << *p <<endl; // here crashed !!
std::string s;
while (std::cin >> s && s != "quit") {
cout << *p << endl;
}
munmap(p, size);
}
As you can see in the code, consumer crashed on正如您在代码中看到的那样,消费者崩溃了
cout << *p << endl;
could you help on this?你能帮忙吗? Is there anything i ignored?
有什么我忽略的吗?
Dynamic Eigen matrices are like std::vector.动态特征矩阵类似于 std::vector。 They don't hold the actual data, they contain pointers to the data plus the size information.
它们不保存实际数据,它们包含指向数据的指针和大小信息。 You mmapped the object, not the actual data.
您映射了 object,而不是实际数据。
Something like this should work:这样的事情应该有效:
Eigen::Index rows = 100, cols = 100;
const void* space = mmap(NULL, rows * cols * sizeof(double),
PROT_READ, MAP_SHARED, fd, 0);
Eigen::MatrixXd::ConstMapType mapped = Eigen::MatrixXd::Map(
static_cast<const double*>(space), rows, cols);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.