如何将 Eigen 映射到共享内存中?
How to mmap Eigen into shared memory?
我想使用 Eigen
库作为我的共享内存数据结构(来自 mmap
)。
这是我的代码:
producer.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:
#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);
}
如您在代码中所见,消费者崩溃于
cout << *p << endl;
你能帮忙吗?有什么我忽略的吗?
动态特征矩阵类似于 std::vector。它们不保存实际数据,它们包含指向数据的指针和大小信息。您映射了对象,而不是实际数据。
像这样的东西应该可以工作:
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);
我想使用 Eigen
库作为我的共享内存数据结构(来自 mmap
)。
这是我的代码:
producer.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:
#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);
}
如您在代码中所见,消费者崩溃于
cout << *p << endl;
你能帮忙吗?有什么我忽略的吗?
动态特征矩阵类似于 std::vector。它们不保存实际数据,它们包含指向数据的指针和大小信息。您映射了对象,而不是实际数据。
像这样的东西应该可以工作:
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);