当前位置: 首页 > wzjs >正文

个人在线视频播放网站搭建网站备案到期

个人在线视频播放网站搭建,网站备案到期,网站开发公司人员配置,wordpress查看自己的评论c代码实现同一台主机两个程序实现实时通信 对于进程间通信方式有很多种,对于本机两个程序中可以实时通信那么应该选择哪个呢?很多人最快想到的就是socket通信。 套接字适用于跨网络的进程间通信,具有网络透明性、灵活性和安全性高的优点&am…

c++代码实现同一台主机两个程序实现实时通信

对于进程间通信方式有很多种,对于本机两个程序中可以实时通信那么应该选择哪个呢?很多人最快想到的就是socket通信。

套接字适用于跨网络的进程间通信,具有网络透明性、灵活性和安全性高的优点,但性能开销较大,延迟较高!

共享内存适用于同一台机器上的进程间通信,具有高性能、低延迟和高吞吐量的优点,但需要手动管理同步机制,安全性较低。所以我们优先使用共享内存来实现,在智能驾驶等工业场景中使用非常多。

共享内存实现

进程A:

#include <cstring>
#include <iostream>
#include <sys/shm.h>
#include <thread>
#include <unistd.h>#define SHM_KEY_A 12345
#define SHM_KEY_B 67890
#define SHM_SIZE 1024void send_messages(char* send_data)
{std::string message;while (std::getline(std::cin, message)) {if (message == "exit") {break;}strncpy(send_data, message.c_str(), SHM_SIZE - 1);send_data[SHM_SIZE - 1] = '\0';while (std::strlen(send_data) > 0) {usleep(100000); // 等待 100 毫秒}}
}void receive_messages(char* recv_data)
{while (true) {while (std::strlen(recv_data) == 0) {usleep(100000); // 等待 100 毫秒}std::cout << "Received message: " << recv_data << std::endl;std::memset(recv_data, 0, SHM_SIZE);}
}int main()
{// 创建共享内存A(用于接收消息)int shmid_a = shmget(SHM_KEY_A, SHM_SIZE, 0666);if (shmid_a == -1) {std::cerr << "Failed to get shared memory A" << std::endl;return 1;}// 创建共享内存B(用于发送消息)int shmid_b = shmget(SHM_KEY_B, SHM_SIZE, 0666);if (shmid_b == -1) {std::cerr << "Failed to get shared memory B" << std::endl;return 1;}// 将共享内存连接到当前进程char* recv_data = (char*)shmat(shmid_a, nullptr, 0);char* send_data = (char*)shmat(shmid_b, nullptr, 0);if (recv_data == (char*)-1 || send_data == (char*)-1) {std::cerr << "Failed to attach shared memory" << std::endl;return 1;}std::thread sender(send_messages, send_data);std::thread receiver(receive_messages, recv_data);sender.join();receiver.join();// 清理共享内存shmdt(recv_data);shmdt(send_data);shmctl(shmid_a, IPC_RMID, nullptr);shmctl(shmid_b, IPC_RMID, nullptr);return 0;
}

进程B:

#include <cstring>
#include <iostream>
#include <sys/shm.h>
#include <thread>
#include <unistd.h>#define SHM_KEY_A 12345
#define SHM_KEY_B 67890
#define SHM_SIZE 1024void send_messages(char* send_data)
{std::string message;while (std::getline(std::cin, message)) {if (message == "exit") {break;}strncpy(send_data, message.c_str(), SHM_SIZE - 1);send_data[SHM_SIZE - 1] = '\0';while (std::strlen(send_data) > 0) {usleep(100000); // 等待 100 毫秒}}
}void receive_messages(char* recv_data)
{while (true) {while (std::strlen(recv_data) == 0) {usleep(100000); // 等待 100 毫秒}std::cout << "Received message: " << recv_data << std::endl;std::memset(recv_data, 0, SHM_SIZE);}
}int main()
{// 获取共享内存A(用于发送消息)int shmid_a = shmget(SHM_KEY_A, SHM_SIZE, IPC_CREAT | 0666);if (shmid_a == -1) {std::cerr << "Failed to create shared memory A" << std::endl;return 1;}// 获取共享内存B(用于接收消息)int shmid_b = shmget(SHM_KEY_B, SHM_SIZE, IPC_CREAT | 0666);if (shmid_b == -1) {std::cerr << "Failed to create shared memory B" << std::endl;return 1;}// 将共享内存连接到当前进程char* send_data = (char*)shmat(shmid_a, nullptr, 0);char* recv_data = (char*)shmat(shmid_b, nullptr, 0);if (send_data == (char*)-1 || recv_data == (char*)-1) {std::cerr << "Failed to attach shared memory" << std::endl;return 1;}std::thread sender(send_messages, send_data);std::thread receiver(receive_messages, recv_data);sender.join();receiver.join();// 清理共享内存shmdt(send_data);shmdt(recv_data);shmctl(shmid_a, IPC_RMID, nullptr);shmctl(shmid_b, IPC_RMID, nullptr);return 0;
}

代码简洁比较容易。有些捞仔可能会问了,除了共享内存还有没有其它方式呢?有!当然有,只不过性能不如共享内存啦。

命名管道实现

进程A:

#include <fstream>
#include <iostream>
#include <sys/stat.h>
#include <thread>
#include <unistd.h>#define PIPE_NAME_A "pipe_a"
#define PIPE_NAME_B "pipe_b"void send_messages(const std::string& pipe_name)
{std::ofstream pipe(pipe_name);if (!pipe) {std::cerr << "Failed to open named pipe for writing" << std::endl;return;}std::cout << "Enter messages to send (type 'exit' to quit):" << std::endl;while (true) {std::string message;std::getline(std::cin, message);if (message == "exit") {break;}pipe << message << std::endl;pipe.flush();}
}void receive_messages(const std::string& pipe_name)
{std::ifstream pipe(pipe_name);if (!pipe) {std::cerr << "Failed to open named pipe for reading" << std::endl;return;}std::cout << "Waiting for messages..." << std::endl;while (true) {std::string message;std::getline(pipe, message);// 处理程序在没有数据时不会频繁地检查管道,从而节省CPU资源,同时保持对新数据的响应if (pipe.eof()) {sleep(1);pipe.clear();pipe.seekg(0, std::ios::end);} else {std::cout << "Received message: " << message << std::endl;}}
}int main()
{// 创建命名管道if (mkfifo(PIPE_NAME_A, 0666) == -1) {std::cerr << "Failed to create named pipe A" << std::endl;return 1;}if (mkfifo(PIPE_NAME_B, 0666) == -1) {std::cerr << "Failed to create named pipe B" << std::endl;return 1;}std::thread sender(send_messages, PIPE_NAME_A);std::thread receiver(receive_messages, PIPE_NAME_B);sender.join();receiver.join();return 0;
}

进程B:

#include <fstream>
#include <iostream>
#include <sys/stat.h>
#include <thread>
#include <unistd.h>#define PIPE_NAME_A "pipe_a"
#define PIPE_NAME_B "pipe_b"void send_messages(const std::string& pipe_name)
{std::ofstream pipe(pipe_name);if (!pipe) {std::cerr << "Failed to open named pipe for writing" << std::endl;return;}std::cout << "Enter messages to send (type 'exit' to quit):" << std::endl;while (true) {std::string message;std::getline(std::cin, message);if (message == "exit") {break;}pipe << message << std::endl;pipe.flush();}
}void receive_messages(const std::string& pipe_name)
{std::ifstream pipe(pipe_name);if (!pipe) {std::cerr << "Failed to open named pipe for reading" << std::endl;return;}std::cout << "Waiting for messages..." << std::endl;while (true) {std::string message;std::getline(pipe, message);if (pipe.eof()) {sleep(1);pipe.clear();pipe.seekg(0, std::ios::end);} else {std::cout << "Received message: " << message << std::endl;}}
}int main()
{std::thread sender(send_messages, PIPE_NAME_B);std::thread receiver(receive_messages, PIPE_NAME_A);sender.join();receiver.join();return 0;
}

相对于共享内存的优缺点:

优点

  • 简单易用:命名管道的实现相对简单,适合用于简单的进程间通信。

缺点

  1. 性能开销:命名管道的性能略低于共享内存,因为数据需要通过内核缓冲区传输。共享内存是所有进程间通信(IPC)机制中最快的,因为它不需要在进程之间复制数据。
  2. 单向通信:命名管道通常是单向的,需要两个管道实现双向通信。

还可以使用消息队列实现(本人使用的是wsl2,微软不支持,故没有代码)


文章转载自:

http://wRFDn8E4.qjsxf.cn
http://HRf05MXE.qjsxf.cn
http://VQ11BMnR.qjsxf.cn
http://5gyy9ZGs.qjsxf.cn
http://1K011CgN.qjsxf.cn
http://G7aQSqVT.qjsxf.cn
http://xxpr3ykq.qjsxf.cn
http://LfWlOhpd.qjsxf.cn
http://HEir7cCo.qjsxf.cn
http://k72QZE3F.qjsxf.cn
http://DhhwdyVl.qjsxf.cn
http://cynkJ6PH.qjsxf.cn
http://7UYvBBfd.qjsxf.cn
http://PWSEQZFR.qjsxf.cn
http://OS0ocL8b.qjsxf.cn
http://d8T73RUa.qjsxf.cn
http://FpsJOTTY.qjsxf.cn
http://v7WWSMdD.qjsxf.cn
http://mXWnXlHL.qjsxf.cn
http://54r7gLja.qjsxf.cn
http://eXXZWOmQ.qjsxf.cn
http://4pYZugTp.qjsxf.cn
http://bstUSPHH.qjsxf.cn
http://GGSwZC7n.qjsxf.cn
http://0xMhQ9FY.qjsxf.cn
http://MEIDI9UO.qjsxf.cn
http://MxmuEZ01.qjsxf.cn
http://u0VU6JlV.qjsxf.cn
http://HNyf0TvC.qjsxf.cn
http://BdR41pBR.qjsxf.cn
http://www.dtcms.com/wzjs/604529.html

相关文章:

  • 建设网站要用到什么语言建设银行 网站 字体
  • 做不锈钢门的网站图案设计制作
  • php网站开发工程师月薪网络推广的方式
  • 农家院网站素材玉溪市住房和建设局公布网站
  • 做网站哪家好 青岛电脑建立网站平台
  • 商业网站案例做微网站需要什么
  • 网站该怎么找到表白网页制作免费网站
  • 家具行业网站建设手机免费云服务器永久使用
  • wordpress 即时站内搜索最新国际新闻事件
  • 小说网站模板html俄罗斯引擎搜索
  • 藁城外贸网站建设seo排名优化是什么意思
  • dw制造网站log怎么做许昌网络推广哪家好
  • hltm 做网站教程嘉兴做外贸网站比较好的公司
  • 青海企业网站制作兰州市门户网站
  • 制作一个网站步骤射击官网
  • 北海哪家公司做网站建设研发wordpress响应 延时
  • 响应式网站标准尺寸在线qq登录无需下载
  • 苏州网站建设问问q778925409强涵温州 网站制作
  • 网站乱码代理一款游戏需要多少钱
  • wordpress 子站seo是哪里
  • 酒店网站怎么做用eclipce做登录网站
  • 机关网站建设的请示科技资讯网站开发大纲
  • 网站推广页网站建设xs029
  • 电子商务网站开发的形式有网站建设有什么需求分析
  • 遂宁模板建站公司阿里云怎么做淘宝客网站
  • 苏州自学网站建设平台做毕设最常去的几个网站
  • 设计单网站建设网站建设大师
  • 哪里有南宁网站建设天天广告联盟
  • 网站技术开发文档模板wordpress 系统要求
  • 设计网站 杭州linux系统如何做网站