c# 与 c++ 内存共享

c++

// main.cpp
#include <windows.h>
#include <iostream> 
#include <stdint.h>

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 <iostream>
#include <windows.h>

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 共享内存是一种进程间通信方式,它使得在内存中创建一段可以被多个进程共享并访问的内存空间。这可以提高进程间的通信效率,因为在共享内存中的数据不需要使用复杂的消息传递机制来传递。 在C语言中,通过使用共享内存,可以非常方便地在不同的进程之间共享数据,而避免使用其他进程间通信方式(如管道、消息队列等)。要使用共享内存,在C语言中可以使用system V或POSIX标准的共享内存函数库,如shmget、shmctl等函数来进行共享内存的创建和管理。例如,可以使用shmget函数来创建共享内存区域,然后使用shmat函数将其映射到进程的地址空间中,实现对共享内存的访问。 需要注意的是,在使用共享内存时,需要保证进程之间对共享内存的读写操作的互斥性,以避免数据的不一致性和冲突。因此,在使用共享内存时,通常需要使用信号量、互斥锁等机制来对共享内存进行同步和保护。 总的来说,共享内存在C语言中的应用广泛,可以用来实现进程之间高效、快速的数据共享,同时也需要一定的技术和经验来有效地使用和管理。 ### 回答2: 共享内存是一种进程间通信的方式,它可以让多个进程之间快速、高效地共享数据。在共享内存中,几个进程可以通过一个共享内存区域来访问同一组数据。这种方式通常比其他的进程间通信方式,比如管道、消息队列等更快速、更高效。 在C语言中,我们可以使用系统提供的共享内存函数来创建、读取、写入、删除共享内存。在创建共享内存时,我们需要指定共享内存的大小,并且需要给共享内存分配一个标识符,这个标识符可以让多个进程之间访问同一个共享内存。 在读写共享内存时,我们需要先将共享内存映射到当前进程的空间中,然后就可以通过指针访问共享内存中的数据了。在访问完共享内存后,我们需要将共享内存从当前进程的空间中解除映射,以免出现内存泄漏等问题。 总之,共享内存是一种非常有用的进程间通信方式,它可以帮助多个进程高效地共享数据。因此,我们在编写多进程程序时,可以尝试使用共享内存来提高程序的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值