这让我感到沮丧.我只是想创建一个共享内存缓冲类,它在通过Boost.Interprocess创建的共享内存中使用,我可以在其中读取/存储数据.我写了以下内容来测试功能
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
using namespace std;
using namespace boost::interprocess;
int main( int argc, char* argv[] ) {
shared_memory_object::remove( "MyName" );
// Create a shared memory object
shared_memory_object shm ( create_only, "MyName", read_write );
// Set size for the shared memory region
shm.truncate(1000);
// Map the whole shared memory in this process
mapped_region region(shm, read_write);
// Get pointer to the beginning of the mapped shared memory region
int* start_ptr;
start_ptr = static_cast<int*>(region.get_address());
// Write data into the …Run Code Online (Sandbox Code Playgroud) 我在创建命名共享内存并检查其大小时遇到麻烦。当我在这样的函数中调用函数GetFileSizeEx时,该函数将失败。关于如何调试的任何想法?
void test_getsize(const char* lpName, int size){
HANDLE handle = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
size, // maximum object size (low-order DWORD)
lpName); // name of mapping object
if (handle== NULL || handle== INVALID_HANDLE_VALUE){
last_error = get_error_from_errorno();
*error_return =1;
}
LARGE_INTEGER new_size;
err = GetFileSizeEx(handle, &new_size);
if (err==0){ printf("err ");} else {printf("pass ");}
printf("size=%lu\n", (unsigned long)new_size.QuadPart);
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
整数包装器对象仅在值127内共享相同的实例?
public class test
{
public static void main(String args[])
{
Integer a1=127;
Integer a2=127;
System.out.println(a1==a2); //output: true
Integer b1=128;
Integer b2=128;
System.out.println(b1==b2); //output: false
Long c1=127L;
Long c2=127L;
System.out.println(c1==c2); // output: true
Long d1=128L;
Long d2=128L;
System.out.println(d1==d2); //output: false
}
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)true false true false
您也可以使用negetive值.当您使用值观察输出时,它们的行为会有所不同.这种不同结果的原因是什么?
对于任何数字,范围应为-127到+127,==则为true或为false.
(全部)伙计们抱歉这是一个拼写错误,我把它作为原始错误,但它是抽象的.抱歉这个错误.现在纠正了......
我试图将一个字符串数组附加到C中的共享内存.我已尽力将字符串数组(array1和数组2)附加到共享内存中.
这里,array1和array2是宽度为20个字符和大小为5的字符串数组(如何指定附件中的字符串对我来说也不是很清楚).此外,a和b分别是1-D整数和浮点数组,大小为5.
我想通过在运行时更新它们的值来改变字符串数组的状态,正如我所做的那样.
#include <stdio.h>
#include <stdlib.h>
#include<sys/shm.h>
#define NUMBER_OF_DATA 5
int main()
{
int size=(NUMBER_OF_DATA*(sizeof(int)+sizeof(float))) + (2*(20*NUMBER_OF_DATA));
key_t key;
key=ftok("/home/android/Desktop/newww.c",4);
int shmid=shmget(key,size,0777|IPC_CREAT);
int *a=(int *)shmat(shmid,0,0);
float *b=(float *)(a+NUMBER_OF_DATA);
char **array1=(char **)(b+NUMBER_OF_DATA);
char **array2=(char **)(array1+(20*NUMBER_OF_DATA));
int i;
for(i=0;i<5;i++)
{
printf("enter value\n");
scanf("%s",array1[i]);
}
shmdt(&shmid);
shmctl(shmid,IPC_RMID,0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的其他过程执行以下操作
int shmid=shmget(key,size,0777|IPC_CREAT);
int *a1=(int *)shmat(shmid,0,0);
float *b1=(float *)(a1+NUMBER_OF_DATA);
char **array11=(char **)(b1+NUMBER_OF_DATA);
char **array22=(char **)((char *)array11+(20*NUMBER_OF_DATA));
for(i=0;i<NUMBER_OF_DATA;i++)
{
a1[i]=aaa[i];
b1[i]=bbb[i];
array11[i]=array111[i];
array22[i]=array2222[i];
}
Run Code Online (Sandbox Code Playgroud)
其中aaa,bbb,array111和array222是其他数组,通过此过程从中将值加载到共享内存中.这两个过程无法帮助我实现我想要的目标.
如果有人能够指出原因并告诉我将字符串数组附加到内存的正确方法,那将是很棒的.谢谢.
我想知道那些内存映射文件有什么文件扩展名.他们是.dll或类似的东西.另一件事是我可以使用这样的文件,如果我不知道它的内容.
我正在尝试创建一个程序,它可以在共享内存的帮助下,在命名,processor.c和receiver.c两个进程之间进行通信,充当客户端和服务器.
第一个程序receiver.c在无限循环中运行,接收字母数字字符串作为用户一次输入一行的输入.从标准输入读取一行后,该程序将此信息发送到另一个程序.两个进程之间的数据共享应该通过共享内存进行.第二个程序processor.c创建一个输出文件vowels.out并等待接收程序发送用户输入.一旦从接收器接收到一行,它就会计算该行中元音的数量,并将元音计数与vowels.out文件中的原始行一起转储.该程序也在无限循环中运行.
这是程序 -
processor.c
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#define SHM_SIZE 10240 /* make it a 10K shared memory segment */
void main()
{
int v=0;
char ch;
int id_shm;
key_t random_key; /* Keys are used for requesting resources*/
char *shmem, *seg;
/* Segment named "6400", should be created by the server. */
random_key = 6400;
/* Locate the segment. Used - shmget() */
if ((id_shm = shmget(random_key, SHM_SIZE, 0660)) < 0) {
perror("shmget");
exit(1);
} …Run Code Online (Sandbox Code Playgroud) 我在写共享内存段时遇到问题.这是代码:
编辑:我删除了==(错误)后,现在我收到总线错误(核心转储),这是编辑后的代码:
// Struct for data from shared memory
typedef struct {
pthread_mutex_t shared_mutex;
int last_used_job_id;
} shared1;
static void *job_generator(void *param)
{
int J = *((int *) param);
shared1 *shd;
int shm;
int job_id;
// Open shared memory, don't create it if doesn't exist
shm = shm_open("/lab5", O_RDWR, 00600);
// Check
if (shm == -1) {
// Open shared memory, create it if doesn't exist (O_CREAT)
shm = shm_open(q_name, O_RDWR | O_CREAT, 00600);
// Map space for struct
shd …Run Code Online (Sandbox Code Playgroud) 我有一个简单的C++结构,基本上包装一个标准的C数组:
struct MyArray {
T* data;
int length;
// ...
}
Run Code Online (Sandbox Code Playgroud)
其中T是数字类型,如float或double. length是数组中元素的数量.通常我的阵列非常大(数万到数千万个元素).
我有一个MPI程序,我希望通过MPI 3共享内存公开两个MyArray,例如a_old和a_new作为共享内存对象的实例.上下文是每个MPI等级读取a_old.然后,每个MPI等级写入某些索引a_new(每个等级只写入其自己的索引集 - 没有重叠).最后,a_old = a_new必须设置所有级别. a_old并且a_new大小相同.现在我通过将Isend/Irecv每个等级的更新值与其他等级同步()来使我的代码工作.但是,由于数据访问模式,我没有理由需要承担消息传递的开销,而是可以使用一个共享内存对象,然后再设置一个屏障a_old = a_new.我认为这会给我更好的表现(但如果我错了请纠正我).
我在查找使用MPI 3共享内存的完整代码示例时遇到了麻烦.大多数站点仅提供参考文档或不完整的代码段.有人可以通过一个简单而完整的代码示例来完成我正在尝试实现的事情(通过MPI共享内存更新和同步数字数组)吗?我理解创建共享内存通信器和窗口,设置围栏等的主要概念,但它确实有助于我的理解,看到一个将它们放在一起的例子.
另外,我应该提一下,我只会在一个节点上运行我的代码,因此我不需要担心跨节点需要多个共享内存对象副本; 我只需要为我的MPI进程运行的单个节点提供一份数据副本.尽管如此,在这种情况下,像OpenMP这样的其他解决方案对我来说也不可行,因为我有大量的MPI代码,并且为了我想分享的一个或两个数组而无法重写所有内容.
我有另一个program1,我创建一个共享内存,我有一个program2,我想检查共享内存是否已创建,如果没有,然后打印错误,什么也不做,如果它已经创建然后访问它.如果之前已经创建了共享内存,那么它可以正常工作,我可以访问它,但我遇到的问题是,如果没有创建共享内存,那么代替什么都不做并打印错误,program2创建共享内存,我没有我不希望这种情况发生.任何帮助将不胜感激,请询问任何可能有用的信息,谢谢!
void main(){
int sm_id;
sm_id = shmget(9000, MAX_USERS * sizeof(User), IPC_CREAT | IPC_EXCL | 0666);
if(sm_id>0){
perror("Shared memory has not been created yet");
exit(1);
}else{
sm_id = shmget(9000, MAX_USERS * sizeof(User), IPC_CREAT | 0666);
list = (User *)shmat(sm_id,0,0);
exit_on_null(list, "Exit on null(error attach)");
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个程序来计算矩阵的行列式(可能很大,最多1000行).因为它可能很大,所以当dim(M) > 250(<250在100毫秒内计算)时我使用多线程.
我的想法是将矩阵分成4个部分,高斯同时消除每个部分,然后重新收集矩阵并计算行列式.
我想知道,如果在多个线程中访问一个向量是安全的,因为它保证我只能访问它的不同部分吗?
另外,哪些提示可以限制内存使用量?我用vector<vector<double>>,所以 8 * 1000 * 1000 doubles可能是一个非常大的麻烦.