CyberRT-共享內存實現

CyberRT共享內存類圖

共享內存消息發布

在這里插入圖片描述
數據用共享內存發布時,首先會創建ShmTransmitter對象,包含兩個主要成員segment和notifier,Segment用于創建共享內存(上面綠色部分),Notifer 最終構建ReadableInfo通知給其他進程。
使用哪個ConditionNotifier-> notify或MulticastNotifier->notify,是在創建時根據配置文件決定的。
ConditionNotifier 在構建時會創建Indicator對象保存到共享內存中。
調ConditionNotifier-> notify,實際時將ReadableInfo保存到Indicator對象。

ConditionNotifier 共享內存數據接收

在這里插入圖片描述
在接收數據時,也會創建同樣的共享內存。如果共享內存存在,則直接打開。
在接收端也有同樣的共享內存操作ConditionNotifier 。
ShmDispatcher會持有多個通道segment,用std::unordered_map<channelid, segment>表示。
同時啟動一個后臺線程ThreadFunc 線程輪詢處理消息回調。

void ShmDispatcher::ThreadFunc() {ReadableInfo readable_info;// 輪詢處理while (!is_shutdown_.load()) {// 100ms, Listen會轉換100000 ms,對比seq,如果不等處理消息。每次輪詢會等待遞減50ms。if (!notifier_->Listen(100, &readable_info)) {ADEBUG << "listen failed.";continue;}if (readable_info.host_id() != host_id_) {ADEBUG << "shm readable info from other host.";continue;}//從共享內存Indicator中讀出的數據uint64_t channel_id = readable_info.channel_id();uint32_t block_index = readable_info.block_index();{ReadLockGuard<AtomicRWLock> lock(segments_lock_);if (segments_.count(channel_id) == 0) {continue;}// check block index// std::unordered_map<uint64_t, uint32_t> previous_indexes_; // 保存key: channelID, value: block_indexif (previous_indexes_.count(channel_id) == 0) {previous_indexes_[channel_id] = UINT32_MAX;}uint32_t& previous_index = previous_indexes_[channel_id];if (block_index != 0 && previous_index != UINT32_MAX) {if (block_index == previous_index) {ADEBUG << "Receive SAME index " << block_index << " of channel "<< channel_id;} else if (block_index < previous_index) {ADEBUG << "Receive PREVIOUS message. last: " << previous_index<< ", now: " << block_index;} else if (block_index - previous_index > 1) {ADEBUG << "Receive JUMP message. last: " << previous_index<< ", now: " << block_index;}}previous_index = block_index;ReadMessage(channel_id, block_index);}}
}

MulticastNotifier共享內存數據接收

MulticastNotifier時采用多播socket實現的,默認

std::string mcast_ip("239.255.0.100");
uint16_t mcast_port = 8888;

創建兩個socket notify_fd_ 用于發生消息,listen_addr用于接收消息。
在這里插入圖片描述
在發送端調用Notify時,時調的MulticastNotifier::Nofify(const ReadableInfo& info)

bool MulticastNotifier::Notify(const ReadableInfo& info) {if (is_shutdown_.load()) {return false;}std::string info_str;info.SerializeTo(&info_str);ssize_t nbytes =sendto(notify_fd_, info_str.c_str(), info_str.size(), 0,(struct sockaddr*)&notify_addr_, sizeof(notify_addr_));return nbytes > 0;
}

接收端用同樣的方式輪詢

bool MulticastNotifier::Listen(int timeout_ms, ReadableInfo* info) {if (is_shutdown_.load()) {return false;}if (info == nullptr) {AERROR << "info nullptr.";return false;}struct pollfd fds;fds.fd = listen_fd_;fds.events = POLLIN;int ready_num = poll(&fds, 1, timeout_ms);if (ready_num > 0) {char buf[32] = {0};  // larger than ReadableInfo::kSizessize_t nbytes = recvfrom(listen_fd_, buf, 32, 0, nullptr, nullptr);if (nbytes == -1) {AERROR << "fail to recvfrom, " << strerror(errno);return false;}return info->DeserializeFrom(buf, nbytes);} else if (ready_num == 0) {ADEBUG << "timeout, no readableinfo.";} else {if (errno == EINTR) {AINFO << "poll was interrupted.";} else {AERROR << "fail to poll, " << strerror(errno);}}return false;
}
bool Block::TryLockForWrite() {int32_t rw_lock_free = kRWLockFree;//lock_num_ == rw_lock_free, kWriteExclusive賦值給lock_num_,返回true//lock_num_ != rw_lock_free, lock_num_賦值給rw_lock_free,返回falseif (!lock_num_.compare_exchange_weak(rw_lock_free, kWriteExclusive,std::memory_order_acq_rel,std::memory_order_relaxed)) {ADEBUG << "lock num: " << lock_num_.load();return false;}return true;
}

總結
1、CyberRT的共享內存讀寫都時需要加鎖的。
2、每次寫數據可以是不連續的block
3、每次當Block.lock_num_= 0:空閑,>0:有讀操作, -1 : 寫操作。
效率不是高。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Navicat 技術指引 | 適用于 GaussDB 的自動運行功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

《第一行代碼:Android》第三版-2.4.2when語句

瀏覽器中輸入網址&#xff1a;play.kotlinlang.org 進去后黏貼代碼點擊Run就可以看到結果了。 when 語句允許傳入任何類型的參數&#xff0c;然后在when結構體中定義一系列條件when還可以進行類型匹配 /*** You can edit, run, and share this code.* play.kotlinlang.org*/ f…

tp8 使用rabbitMQ

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且還要開啟 php.ini中的 socket 擴展 php think make:command SimpleMQProduce //創建一個生產者命令行 php think make:command SimpleMQConsumer //創建一個消費者命令行 生產者代碼 <?php declare (strict_ty…

一個ETL流程搞定數據脫敏

數據脫敏是什么&#xff1f; 數據脫敏是指在數據處理過程中&#xff0c;通過一系列的技術手段去除或者替換敏感信息&#xff0c;以保護個人隱私和敏感信息的安全的過程。數據脫敏通常在數據共享、數據分析和軟件測試等場景下使用&#xff0c;它旨在降低數據泄露和濫用的風險。…

運動戴什么耳機好?運動無線耳機哪個品牌比較好?運動耳機推薦

?如果你是一名戶外運動愛好者&#xff0c;那么一款高品質的運動耳機是必不可少的。它們具備好音質、高穩固性舒適度、防塵防水等多項防護功能&#xff0c;讓你在惡劣的天氣條件下也能保持音樂的陪伴。面對市面上越來越多的運動耳機&#xff0c;到底哪款更值得入手&#xff1f;…

臉愛云一臉通智慧管理平臺未授權訪問

聲明 本文僅用于技術交流&#xff0c;請勿用于非法用途 由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失&#xff0c;均由使用者本人負責&#xff0c;文章作者不為此承擔任何責任。 一、漏洞概述 臉愛云一臉通智慧管理平臺存在嚴重漏洞&#xff0c;允許…

[36] 有效的數獨 js

題目描述&#xff1a; 請你判斷一個 9 x 9 的數獨是否有效。只需要 根據以下規則 &#xff0c;驗證已經填入的數字是否有效即可。 * * * 數字 1-9 在每一行只能出現一次。 * 數字 1-9 在每一列只能出現一次。 * 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。&#x…

文件差分服務設計

需求 OTA&#xff08;Over-The-Air&#xff09;升級是一種至關重要的技術&#xff0c;用于更新嵌入式設備的固件或軟件&#xff0c;以確保設備具備最新功能和修復漏洞。在OTA升級過程中&#xff0c;使用差異算法工具&#xff08;如bsdiff、hdiffpatch和xdelta3&#xff09;能夠…

C++:一文讀懂智能指針

C11 引入了 3 個智能指針類型&#xff1a; 當使用智能指針時&#xff0c;我們首先需要包含 memory頭文件&#xff0c;這個頭文件包含了 C 標準庫中智能指針的定義。 1.std::unique_ptr<T> &#xff1a;獨占資源所有權的指針。 2.std::shared_ptr<T> &#xff1a;共…

【數據結構初階(4)】棧的基本操作實現

文章目錄 Ⅰ 概念及結構1. 棧的概念2. 棧的操作 Ⅱ 基本操作實現1. 棧的定義2. 初始化棧3. 元素入棧4. 元素出棧5. 獲取棧頂元素6. 獲取棧中有效元素個數7. 判斷棧空8. 銷毀棧 Ⅰ 概念及結構 1. 棧的概念 棧&#xff1a;棧是一種特殊的線性表&#xff0c;其只允許在固定的一端…

STM32分區跳轉問題

項目場景&#xff1a; 在OTA中&#xff0c;FLASH通常被劃分為以下幾種類型 bootloaderiapappbootloaderappapp保存區bootloaderapp1app2 不同的分區方式有不同的有點&#xff0c;但是共同點都是需要執行分區跳轉 問題1描述 但在分區跳轉過程中遇到過使用不同的編譯器不能跳轉…

Java,泛型

目錄 泛型的理解&#xff1a; 在ArrayList中使用泛型&#xff1a; 在Map中使用泛型&#xff1a; 在接口中使用泛型&#xff1a; 自定義泛型類/接口與自定義泛型方法 自定義類/接口&#xff1a; 關于泛型類的子類&#xff1a; 注意點&#xff1a; 注意點&#xff1a; 自…

MATLAB實現灰色預測

久違了&#xff0c;前段時間由于學習壓力大&#xff0c;就沒怎么更新MATLAB相關的內容&#xff0c;今天實在學不進去了&#xff0c;換個內容更新一下~ 本貼介紹灰色預測模型&#xff0c;這也是數學建模競賽常見算法中的一員&#xff0c;和許多預測模型一樣——底層原理是根據已…

監控員工上網有什么軟件丨三款好用的員工上網管理軟件推薦

監控員工上網行為是企業管理中不可或缺的一部分&#xff0c;因此&#xff0c;選擇一款好的監控員工上網的軟件至關重要。目前市場上存在多種監控員工上網的軟件&#xff0c;它們具有各種特點和功能&#xff0c;但企業需要仔細評估和選擇。 一、域之盾軟件 這是一款優秀的監控員…

利用GenericMenu創建上下文菜單或下拉菜單

使用GenericMenu 創建自定義上下文菜單和下拉菜單豐富自己的編輯器功能。 GenericMenu 介紹 變量 allowDuplicateNames 允許菜單具有多個同名的菜單項。 公共函數 AddDisabledItem 向菜單添加已禁用的項。 AddItem 向菜單添加一個項。 AddSeparator 向菜單添加一個分隔符項…

grafana二次啟動失敗

背景 安裝grafana后啟動使用正常&#xff0c;但是關機后再啟動顯示啟動失敗&#xff0c;但是看日志又沒有報錯信息&#xff0c;但是就是啟動不了 原因分析 其實是/var/lib/grafana/grafana.db文件損壞了&#xff0c;所以需要把這個文件刪掉之后重新啟動就正常了&#xff0c;…

如何在AppLink配置金蝶云星空預算使用單流程

上一篇有提到金蝶云星空如何通過AppLink平臺配置銷售訂單操作&#xff0c;這次來演示下如何“保存預算使用單”、“調撥單定時自動審核”以及“預算使用單反審核后刪除”操作。 根據請求數據保存預算使用單 當webhook接收到數據時觸發流程 步驟1&#xff1a;根據webhook的請…

OpenGL YUV 和 RGB 圖像相互轉換出現的偏色問題怎么解決?

未經作者(微信ID:Byte-Flow)允許,禁止轉載 文章首發于公眾號:字節流動 早上知識星球里的一位同學,遇到 yuv2rgb 偏色問題,這個問題比較典型,今天展開說一下。 省流版 首先 yuv2rgb 和 rgb2yuv 之間的轉換要基于相同的標準,轉換使用不同的標準肯定會引起偏色,常見的…

短視頻矩陣系統源碼搭建部署分享

一、 短視頻矩陣系統源碼搭建部署分享 目錄 一、 短視頻矩陣系統源碼搭建部署分享 二、短視頻矩陣系統搭建功能設計 三、 抖音矩陣號矩陣系統功能設計原則 四、 短視頻矩陣開發部分源碼展示 很高興能夠幫助您&#xff0c;以下是短視頻矩陣系統源碼搭建部署分享&#xff1a…

怎么快速卸載office365

怎么快速卸載office365 根據官網提供的兩種解決方案即點即用或MSIMicrosoft Store 根據官網提供的兩種解決方案 官網地址&#xff1a;https://support.microsoft.com/zh-cn/office/%E4%BB%8E-pc-%E5%8D%B8%E8%BD%BD-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8#OfficeVersio…