<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++可移植性及多線程

C語言與CPP編程 ? 來源:C語言與CPP編程 ? 作者:C語言與CPP編程 ? 2022-10-10 10:26 ? 次閱讀

本系列是開源書C++ Best Practises[1]的中文版,全書從工具、代碼風格、安全性、可維護性、可移植性、多線程、性能、正確性等角度全面介紹了現代C++項目的最佳實踐。本文是該系列的第五篇。

C++最佳實踐:

1. 工具

2. 代碼風格

3.安全性

4.可維護性

5.可移植性及多線程(本文)

6.性能

7.正確性和腳本

可移植性

明確使用的類型

大多數產生告警的可移植性問題都是因為我們沒有注意類型。標準庫和數組使用size_t作為索引,標準容器的大小使用size_t類型。如果對size_t的處理不正確,可能會潛伏有微妙的64位問題,這種問題只有在開始32位整型索引溢出之后才會出現。另一種類似問題是char類型和unsigned char類型的使用。

使用標準庫

std::filesystem

C++17新增了新的filesystem庫,在所有支持的編譯器上提供了可移植的文件系統訪問能力。

std::thread

C++11的線程功能能夠基于pthread或WinThreads使用。

其他

本系列中的其他大多數問題最終都可以歸結到可移植性上,尤其要注意避免靜態(static)類型(參考下文多線程部分)。

多線程

避免全局數據

全局數據會導致函數之間意想不到的副作用,并可能使代碼難以甚至無法并行化。即使現在的代碼不是為了并行化而寫,也沒有理由在將來永遠不做并行化。

靜態(static)數據

除了作為全局數據之外,靜態數據并不總是像期望的那樣被構造和析構,在跨平臺環境中尤其如此。例如,有個g++的bug[2]就是關于從動態模塊加載的共享靜態數據的銷毀順序的。

共享指針

std::shared_ptr和全局變量一樣(http://stackoverflow.com/a/18803611/29975),允許多段代碼與相同的數據交互。

單例(Singleton)

單例通常使用靜態和/或shared_ptr實現。

避免堆操作

堆操作在多線程環境中要慢得多,在許多甚至大多數情況下,復制數據會更快,更別提還有move操作這之類的東西。

互斥對象(mutex)和可變對象(mutable)一起使用(M&M規則,C++11)

對于成員變量,最好同時使用互斥鎖和可變變量,這在兩方面都適用:

可變成員變量被假定為共享變量,因此應該與互斥鎖同步(或原子化)。

如果一個成員變量本身是互斥的,那么應該是可變的,這是在const成員函數中使用它所必需的。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    21

    文章

    2066

    瀏覽量

    72900
  • 代碼
    +關注

    關注

    30

    文章

    4555

    瀏覽量

    66766
  • 可移植性
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7569

原文標題:C++最佳實踐 | 5. 可移植性及多線程

文章出處:【微信號:C語言與CPP編程,微信公眾號:C語言與CPP編程】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    現代C++項目的最佳實踐

    本系列是開源書C++ Best Practises[1]的中文版,全書從工具、代碼風格、安全性、可維護性、可移植性、多線程、性能、正確性等角度全面介紹了現代C++項目的最佳實踐。本文是
    發表于 09-29 11:32 ?844次閱讀

    Java多線程的用法

    本文將介紹一下Java多線程的用法。 基礎介紹 什么是多線程 指的是在一個進程中同時運行多個線程,每個線程都可以獨立執行不同的任務或操作。 與單線程
    的頭像 發表于 09-30 17:07 ?621次閱讀

    [原創]嵌入式操作系統的可移植性

      嵌入式操作系統的可移植性創易電子整理出品,創易更懂電子, http://52edk.taobao.com/ 全系列阻容感一本全掌控。許多操作系統夸耀自己的可移植性時,愛這樣說
    發表于 03-16 22:11

    51單片機多線程實現

    51單片機多線程實現,給STC89C52RC單片機移植RTX-Tiny操作系統,簡單到爆,B格拉滿了,好吧?
    發表于 07-14 06:43

    Multi-Threaded多線程編程

    C++ 多線程(一)Multi-Threaded多線程編程術語線程更確切地說,是執行線程,它是最小的處理單元。由操作系統調度。通常它包含在進
    發表于 08-24 08:31

    一文搞懂C++多線程rknn_ssd例程

    1、C++多線程rknn_ssd例程簡析本例程修改自rk官方提供的rknn_sdd.cpp,處理的數據流來自usb-camera,幀率在25fps添加本地視頻讀取功能,640x480的視頻流,幀率可達50fps支持線程綁定CPU
    發表于 08-01 17:53

    如何使用std::future/std::promise 和 std::packaged_task來促進esp32上的多線程?

    信不適用于 std::thread。您如何建議我執行與所需功能兼容的多任務處理?我應該使用附加組件從 pthread 層開始,還是可以使用 std::thread 實現完全可移植性?
    發表于 03-02 08:44

    C++ 面向對象多線程編程下載

    C++ 面向對象多線程編程下載
    發表于 04-08 02:14 ?70次下載

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構建多線程架構與增量多線程編程技術。第1章介紹了
    發表于 09-25 09:39 ?0次下載

    多線程好還是單線程好?單線程多線程的區別 優缺點分析

    摘要:如今單線程多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區別又
    發表于 12-08 09:33 ?8w次閱讀

    什么是多線程編程?多線程編程基礎知識

    摘要:多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及多線程編程相關知識而做出的一些結論。
    發表于 12-08 16:30 ?1.2w次閱讀

    一文解讀32位單片機的應用可移植性

    本文主要介紹了32位單片機的應用可移植性.
    發表于 06-28 03:25 ?0次下載
    一文解讀32位單片機的應用<b class='flag-5'>可移植性</b>

    C++項目常見的命名規范

    本系列是開源書C++ Best Practises[1]的中文版,全書從工具、代碼風格、安全性、可維護性、可移植性、多線程、性能、正確性等角度全面介紹了現代C++項目的最佳實踐。本文是
    的頭像 發表于 09-27 09:12 ?1804次閱讀

    如何用C++實現一個線程池呢?

    C++線程池是一種多線程管理模型,把線程分成任務執行和線程調度兩部分。
    發表于 06-08 14:53 ?796次閱讀
    如何用<b class='flag-5'>C++</b>實現一個<b class='flag-5'>線程</b>池呢?

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發中非常重要,它可以實現程序的并發執行,提高程序的效率和響應速度。MFC提供了豐富的多線程支持,可以輕松地實現
    的頭像 發表于 12-01 14:29 ?504次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>