进程间通信-共享内存以及使用案例

在这里插入图片描述
服务器与客户端通过共享内存进行通信
1.common.h

#ifndef __COMMON_H
#define __COMMON_H

#define TEXT_LEN 2048

// 共享内存的数据结构
struct SharedMemEntry
{
    bool can_read; // 是否可以读取共享内存,用于进程同步
    char message[TEXT_LEN];
};

#endif // __COMMON_H

2.server.cpp

#include "common.h"
#include <iostream>
#include <chrono>
#include <sys/shm.h>
#include <unistd.h>

int main()
{
    SharedMemEntry *entry;

    //1、申请共享内存
    int shared_mem_id = shmget(1, sizeof(SharedMemEntry), 0600 | IPC_CREAT);
    if (shared_mem_id == -1)
    {
        std::cout << "Create shared memory error" << std::endl;
        return -1;
    }

    // 2、连接到当前进程空间/使用共享内存
    entry = (SharedMemEntry *)shmat(shared_mem_id, 0, 0);
    entry->can_read = false;
    while (true)
    {
        if (entry->can_read)
        {
            std::cout << "Received message:" << entry->message << std::endl;
            entry->can_read = false;
        }
        else
        {
            std::cout << "Entry can not be read. Sleep 1s." << std::endl;
            sleep(1);
        }
    }
    // 3、脱离进程空间
    shmdt(entry);
    // 4、删除共享内存
    shmctl(shared_mem_id, IPC_RMID, 0);
    return 0;
}
  1. client.cpp
#include "common.h"
#include <sys/shm.h>
#include <iostream>
#include <cstring>

int main()
{
    SharedMemEntry *entry;

    // 1、申请共享内存
    int shmid = shmget(1, sizeof(SharedMemEntry), 0600 | IPC_CREAT);
    if (shmid == -1)
    {
        std::cout << "Create shared memory failer" << std::endl;
        return -1;
    }

    // 连接到当前进程空间
    entry = (SharedMemEntry *)shmat(shmid, 0, 0);
    entry->can_read = false;
    char buffer[TEXT_LEN];
    while (true)
    {
        if (!entry->can_read)
        {
            std::cout << "input message >>>";
            fgets(buffer, TEXT_LEN, stdin);
            strncpy(entry->message, buffer, TEXT_LEN);
            std::cout << "send message: " << entry->message << std::endl;
            entry->can_read = true;
        }
    }
    shmdt(entry);
    shmctl(shmid, IPC_RMID, 0);
}```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 `multiprocessing` 模块实现的基础案例,包括了 Process 类、进程间通信、进程池、进程同步和共享内存等功能: ```python import multiprocessing # 定义一个函数,用于向队列中写入数据 def write_data(queue): for i in range(10): queue.put(i) print("write_data finished") # 定义一个函数,用于从队列中读取数据 def read_data(queue): while True: data = queue.get() if data is None: break print("read_data received:", data) print("read_data finished") # 定义一个函数,用于计算阶乘 def factorial(n, result_queue): result = 1 for i in range(1, n+1): result *= i result_queue.put(result) # 定义一个函数,用于加锁 def increment(lock, shared_value): for i in range(10000): lock.acquire() shared_value.value += 1 lock.release() # 定义一个函数,用于创建进程池 def create_pool(): with multiprocessing.Pool(processes=4) as pool: results = pool.map_async(factorial, [5, 6, 7, 8]) pool.close() pool.join() print(results.get()) if __name__ == '__main__': # 创建一个队列,用于进程间通信 queue = multiprocessing.Queue() # 创建两个进程,一个向队列中写入数据,一个从队列中读取数据 p1 = multiprocessing.Process(target=write_data, args=(queue,)) p2 = multiprocessing.Process(target=read_data, args=(queue,)) # 启动进程 p1.start() p2.start() # 等待进程结束 p1.join() queue.put(None) p2.join() # 创建一个共享内存,用于多个进程之间共享数据 shared_value = multiprocessing.Value('i', 0) lock = multiprocessing.Lock() # 创建多个进程,用于对共享内存进行加锁操作 processes = [multiprocessing.Process(target=increment, args=(lock, shared_value)) for _ in range(4)] # 启动进程 for process in processes: process.start() # 等待进程结束 for process in processes: process.join() print("shared_value:", shared_value.value) # 创建一个进程池,用于计算阶乘 create_pool() ``` 这个案例中,我们首先创建了一个队列,用于实现进程间通信,然后创建了两个进程,一个向队列中写入数据,一个从队列中读取数据。接着,我们创建了一个共享内存,用于多个进程之间共享数据,并创建了多个进程,用于对共享内存进行加锁操作。最后,我们创建了一个进程池,用于计算阶乘。这个案例中涉及到了 `Process` 类、队列、共享内存、进程池和进程同步等多个 `multiprocessing` 模块的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值