c# 与 c++ 内存共享

c++

// main.cpp
#include 
#include  
#include 

using namespace std;

#define BUF_SIZE 1024

int main(int argc, TCHAR* argv[])
{
    // 定义共享数据
    //char szBuffer[] = "Hello Shared Memory";

    float szBuffer[] = { 1,2,3,4,5,6,7,8,9,10 };

  /*  char szBuffer2[40] = { 0 };
    memcpy(szBuffer2, szBuffer, 40);*/

    // 创建共享文件句柄 
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,   // 物理文件句柄
        NULL,                   // 默认安全级别
        PAGE_READWRITE,         // 可读可写
        0,                      // 高位文件大小
        BUF_SIZE,               // 地位文件大小
        L"global_share_memory1"           // 共享内存名称
    );

    // 映射缓存区视图 , 得到指向共享内存的指针
    LPVOID lpBase = MapViewOfFile(
        hMapFile,               // 共享内存的句柄
        FILE_MAP_ALL_ACCESS,    // 可读写许可
        0,
        0,
        BUF_SIZE
    );

    // 将数据拷贝到共享内存
#pragma warning(suppress : 4996)
    memcpy((char*)lpBase, szBuffer, sizeof(szBuffer));
    cout << "存放入共享内存的数据:" << (char*)lpBase << endl;

    // 解除文件映射
    UnmapViewOfFile(lpBase);

    system("pause"); //等待其他进程读取数据

    // 关闭内存映射文件对象句柄,只要不关闭共享内存的句柄,此进程还在,其他进程就可以读取共享内存。
    //CloseHandle(hMapFile);
    return 0;
}

#include 
#include 

using namespace std;

int main()
{
    LPVOID pBuffer;
    string strMapName("global_share_memory1");
    HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, L"global_share_memory1");
    if (NULL == hMap)
    {
        cout << "无共享内存..." << endl;
    }
    else
    {
        float sline[10] = {0};
        while (true)
        {
            Sleep(1000);
            pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
            memcpy(sline, pBuffer, sizeof(sline));
            cout << "读取共享内存数据:" << sline[0] << endl;
        }
    }
}

C#

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace cs_share
{
    class Program
    {
        //static void Main(string[] args)
        //{
        //    //定义内存大小
        //    int size = 1024;

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

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

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

        //    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();
        //}

        static void Main(string[] args)
        {
            using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("global_share_memory1"))
            {
                //Mutex mutex = Mutex.OpenExisting("IPC_MAP_MUTEX");
                // 等待写入完成
                //mutex.WaitOne();

                for (int j = 0; j < 10; j++)
                {
                    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                    {
                        BinaryReader sr = new BinaryReader(stream);
                        byte[] buffer = new byte[40];
                        int ui = sr.Read(buffer, 0, buffer.Length);

                        float[] floatArr = new float[buffer.Length / 4];
                        第一种方法,字节数组转换类转换,最容易想到和处理

                        第二种方法,缓存复制--最为简洁
                        Buffer.BlockCopy(buffer, 0, floatArr, 0, buffer.Length);

                        //for (int i = 0; i < floatArr.Length; i++)
                        //{
                        //    floatArr[i] = buffer[i * 4] | buffer[i * 4 + 1] << 8 | buffer[i * 4 + 2] << 16 | buffer[i * 4 + 3] << 24;
                        //}

                        // 读取进程 A 写入的内容
                        //Console.WriteLine($"recv:: {}");
                        System.Threading.Thread.Sleep(1000);
                    }

                }
                //mutex.ReleaseMutex();
            }

            Console.ReadLine();
        }
    }
}

你可能感兴趣的:(c++)