c++,c#,ypthon,三种语言的内存共享的实现

最近研究了一下共享内存,以下代码都已实验过,测试可以完成功能。(注意在读共享内存的时候,需要保证写入共享内存的句柄不能关闭,不然会出错)。这里给出的C++和C#的代码可以联动,python代码可以自己写,自己读(同样保证读的时候,写的句柄不要关闭)。

C++

C++端获得C#共享的文件

此C++代码参考:https://www.jianshu.com/p/b3e42b348194

#include "stdafx.h"
#include 
#include 
#include 

using namespace std;

int main()
{
	LPVOID pBuffer;
	HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, L"global_share_memory");
	if (NULL == hMap)
	{
		cout << "无共享内存..." << endl;
		getchar();
	}
	else
	{
		while (true)
		{
			Sleep(1000);
			pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
			cout << "读取共享内存数据:" << (char*)pBuffer << endl;
			getchar();

		}
	}
}

C#

C#端为C++端写入数据

此C#代码参考:https://www.jianshu.com/p/b3e42b348194

using System;
using System.IO.MemoryMappedFiles;


namespace gg
{
    class Program
    {
        static void Main(string[] args)
        {

        //定义内存大小
        int size = 1024;

        //创建共享内存
        MemoryMappedFile shareMemory = MemoryMappedFile.CreateOrOpen("global_share_memory", size);

        Console.WriteLine("创建共享内存完成...");

        //线程等待10秒
        //System.Threading.Thread.Sleep(1000);

        var stream = shareMemory.CreateViewStream(0, size);

        string value = "Hello World";

        byte[] data = System.Text.Encoding.UTF8.GetBytes(value);

        stream.Write(data, 0, data.Length);

        stream.Dispose();

        Console.ReadKey();

        }
    }
}

python

python端的读取和写入都已经给出。(python也有调用win32 API的方法,这里暂不给出)

import mmap


str = 'hello world!'
byte = str.encode()
SHMEMSIZE = len(str)

file_name = 'global_share_memory'
print(file_name)

# python写入共享内存
shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_WRITE)
shmem.write(byte)
shmem.close()

# python读取共享内存
shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)
print(shmem.read(2))
print(shmem.read(SHMEMSIZE).decode("utf-8"))
print(shmem.read(SHMEMSIZE).decode("ansi"))
shmem.close()

参考文章:

https://www.jianshu.com/p/b3e42b348194

同时给出C++官方的共享内存的方法:

https://docs.microsoft.com/zh-cn/windows/win32/memory/creating-named-shared-memory

 

你可能感兴趣的:(c++,c#,ypthon,三种语言的内存共享的实现)