0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++可移植性及多線(xiàn)程

C語(yǔ)言與CPP編程 ? 來(lái)源:C語(yǔ)言與CPP編程 ? 作者:C語(yǔ)言與CPP編程 ? 2022-10-10 10:26 ? 次閱讀

本系列是開(kāi)源書(shū)C++ Best Practises[1]的中文版,全書(shū)從工具、代碼風(fēng)格、安全性、可維護(hù)性、可移植性、多線(xiàn)程、性能、正確性等角度全面介紹了現(xiàn)代C++項(xiàng)目的最佳實(shí)踐。本文是該系列的第五篇。

C++最佳實(shí)踐:

1. 工具

2. 代碼風(fēng)格

3.安全性

4.可維護(hù)性

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

6.性能

7.正確性和腳本

可移植性

明確使用的類(lèi)型

大多數(shù)產(chǎn)生告警的可移植性問(wèn)題都是因?yàn)槲覀儧](méi)有注意類(lèi)型。標(biāo)準(zhǔn)庫(kù)和數(shù)組使用size_t作為索引,標(biāo)準(zhǔn)容器的大小使用size_t類(lèi)型。如果對(duì)size_t的處理不正確,可能會(huì)潛伏有微妙的64位問(wèn)題,這種問(wèn)題只有在開(kāi)始32位整型索引溢出之后才會(huì)出現(xiàn)。另一種類(lèi)似問(wèn)題是char類(lèi)型和unsigned char類(lèi)型的使用。

使用標(biāo)準(zhǔn)庫(kù)

std::filesystem

C++17新增了新的filesystem庫(kù),在所有支持的編譯器上提供了可移植的文件系統(tǒng)訪(fǎng)問(wèn)能力。

std::thread

C++11的線(xiàn)程功能能夠基于pthread或WinThreads使用。

其他

本系列中的其他大多數(shù)問(wèn)題最終都可以歸結(jié)到可移植性上,尤其要注意避免靜態(tài)(static)類(lèi)型(參考下文多線(xiàn)程部分)。

多線(xiàn)程

避免全局?jǐn)?shù)據(jù)

全局?jǐn)?shù)據(jù)會(huì)導(dǎo)致函數(shù)之間意想不到的副作用,并可能使代碼難以甚至無(wú)法并行化。即使現(xiàn)在的代碼不是為了并行化而寫(xiě),也沒(méi)有理由在將來(lái)永遠(yuǎn)不做并行化。

靜態(tài)(static)數(shù)據(jù)

除了作為全局?jǐn)?shù)據(jù)之外,靜態(tài)數(shù)據(jù)并不總是像期望的那樣被構(gòu)造和析構(gòu),在跨平臺(tái)環(huán)境中尤其如此。例如,有個(gè)g++的bug[2]就是關(guān)于從動(dòng)態(tài)模塊加載的共享靜態(tài)數(shù)據(jù)的銷(xiāo)毀順序的。

共享指針

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

單例(Singleton)

單例通常使用靜態(tài)和/或shared_ptr實(shí)現(xiàn)。

避免堆操作

堆操作在多線(xiàn)程環(huán)境中要慢得多,在許多甚至大多數(shù)情況下,復(fù)制數(shù)據(jù)會(huì)更快,更別提還有move操作這之類(lèi)的東西。

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

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

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

如果一個(gè)成員變量本身是互斥的,那么應(yīng)該是可變的,這是在const成員函數(shù)中使用它所必需的。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

    73453
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
  • 可移植性
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7598

原文標(biāo)題:C++最佳實(shí)踐 | 5. 可移植性及多線(xiàn)程

文章出處:【微信號(hào):C語(yǔ)言與CPP編程,微信公眾號(hào):C語(yǔ)言與CPP編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    現(xiàn)代C++項(xiàng)目的最佳實(shí)踐

    本系列是開(kāi)源書(shū)C++ Best Practises[1]的中文版,全書(shū)從工具、代碼風(fēng)格、安全、可維護(hù)、可移植性、多線(xiàn)程、性能、正確
    發(fā)表于 09-29 11:32 ?1119次閱讀

    Multi-Threaded多線(xiàn)程編程

    C++ 多線(xiàn)程(一)Multi-Threaded多線(xiàn)程編程術(shù)語(yǔ)線(xiàn)程更確切地說(shuō),是執(zhí)行線(xiàn)程,它是最小的處理單元。由操作系統(tǒng)調(diào)度。通常它包含在進(jìn)
    發(fā)表于 08-24 08:31

    一文搞懂C++多線(xiàn)程rknn_ssd例程

    1、C++多線(xiàn)程rknn_ssd例程簡(jiǎn)析本例程修改自rk官方提供的rknn_sdd.cpp,處理的數(shù)據(jù)流來(lái)自u(píng)sb-camera,幀率在25fps添加本地視頻讀取功能,640x480的視頻流,幀率可達(dá)50fps支持線(xiàn)程綁定CPU
    發(fā)表于 08-01 17:53

    C++ 面向?qū)ο?b class='flag-5'>多線(xiàn)程編程下載

    C++ 面向?qū)ο?b class='flag-5'>多線(xiàn)程編程下載
    發(fā)表于 04-08 02:14 ?70次下載

    C++面向?qū)ο?b class='flag-5'>多線(xiàn)程編程 (pdf電子版)

    C++面向?qū)ο?b class='flag-5'>多線(xiàn)程編程共分13章,全面講解構(gòu)建多線(xiàn)程架構(gòu)與增量多線(xiàn)程編程技術(shù)。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    多線(xiàn)程編程之Linux線(xiàn)程編程

    可移植性。 (1)函數(shù)說(shuō)明。 創(chuàng)建線(xiàn)程實(shí)際上就是確定調(diào)用該線(xiàn)程函數(shù)的入口點(diǎn),這里通常使用的函數(shù)是pthread_create()。在線(xiàn)程創(chuàng)建以后,就開(kāi)始運(yùn)行相關(guān)的
    發(fā)表于 10-18 15:55 ?3次下載

    C#多線(xiàn)程技術(shù)

    C#和.NET類(lèi)庫(kù)為開(kāi)發(fā)多線(xiàn)程應(yīng)用程序提供了很方便的支持,本章首先簡(jiǎn)要介紹.NET類(lèi)庫(kù)中的Thread類(lèi)及各種線(xiàn)程支持,再通過(guò)示例說(shuō)明線(xiàn)程使用中需要掌握的規(guī)則,最后論述
    發(fā)表于 04-23 11:32 ?15次下載

    一文解讀32位單片機(jī)的應(yīng)用可移植性

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

    多線(xiàn)程架構(gòu)存在的必要

    多線(xiàn)程架構(gòu)存在的必要說(shuō)明。
    發(fā)表于 03-26 11:22 ?8次下載
    <b class='flag-5'>多線(xiàn)程</b>架構(gòu)存在的必要<b class='flag-5'>性</b>

    C++項(xiàng)目常見(jiàn)的命名規(guī)范

    本系列是開(kāi)源書(shū)C++ Best Practises[1]的中文版,全書(shū)從工具、代碼風(fēng)格、安全、可維護(hù)、可移植性、多線(xiàn)程、性能、正確
    的頭像 發(fā)表于 09-27 09:12 ?2043次閱讀

    如何使用in_place_t和相關(guān)標(biāo)簽高效創(chuàng)建

    本系列是開(kāi)源書(shū)C++ Best Practises[1]的中文版,全書(shū)從工具、代碼風(fēng)格、安全、可維護(hù)可移植性、多線(xiàn)程、性能、正確
    的頭像 發(fā)表于 10-13 08:59 ?863次閱讀

    多線(xiàn)程編程可以應(yīng)用在哪里?C++多線(xiàn)程詳解

    多線(xiàn)程并發(fā)指的是在同一個(gè)進(jìn)程中執(zhí)行多個(gè)線(xiàn)程。 優(yōu)點(diǎn): 有操作系統(tǒng)相關(guān)知識(shí)的應(yīng)該知道,線(xiàn)程是輕量級(jí)的進(jìn)程,每個(gè)線(xiàn)程可以獨(dú)立的運(yùn)行不同的指令序列,但是線(xiàn)
    發(fā)表于 04-13 10:10 ?658次閱讀

    如何用C++實(shí)現(xiàn)一個(gè)線(xiàn)程池呢?

    C++線(xiàn)程池是一種多線(xiàn)程管理模型,把線(xiàn)程分成任務(wù)執(zhí)行和線(xiàn)程調(diào)度兩部分。
    發(fā)表于 06-08 14:53 ?1696次閱讀
    如何用<b class='flag-5'>C++</b>實(shí)現(xiàn)一個(gè)<b class='flag-5'>線(xiàn)程</b>池呢?

    多線(xiàn)程如何保證數(shù)據(jù)的同步

    多線(xiàn)程編程是一種并發(fā)編程的方法,意味著程序中同時(shí)運(yùn)行多個(gè)線(xiàn)程,每個(gè)線(xiàn)程可獨(dú)立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線(xiàn)程并發(fā)執(zhí)行的特點(diǎn),會(huì)引發(fā)數(shù)據(jù)同步的問(wèn)題,即保證多個(gè)
    的頭像 發(fā)表于 11-17 14:22 ?1105次閱讀

    mfc多線(xiàn)程編程實(shí)例

    MFC(Microsoft Foundation Class Library)是一個(gè)基于Windows的C++開(kāi)發(fā)框架,廣泛應(yīng)用于軟件開(kāi)發(fā)中。MFC提供了許多實(shí)用的類(lèi)和函數(shù),方便開(kāi)發(fā)人員進(jìn)行GUI
    的頭像 發(fā)表于 12-01 14:29 ?1377次閱讀