国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【編程】C++語言編程規(guī)范-2

這篇具有很好參考價(jià)值的文章主要介紹了【編程】C++語言編程規(guī)范-2。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

編程實(shí)踐

結(jié)合C++ Effective系列參考樹、尤其是工程經(jīng)驗(yàn)教訓(xùn)的總結(jié)。

并發(fā)

  • 除非必要,盡量少用線程。
  • 多線程編程要守護(hù)好內(nèi)存,使用atomic、mutex、condition variable、future、semaphore、latch、barrier等同步機(jī)制避免數(shù)據(jù)競爭。
  • 盡量縮小臨界區(qū),臨界區(qū)指獨(dú)占的資源,禁止其他線程訪問變量的代碼片段,如持有mutex的作用域。與回調(diào)函數(shù)相似,應(yīng)盡可能精簡此類操作,避免執(zhí)行耗時(shí)的處理、阻塞性操作如sleep。能在臨界區(qū)、回調(diào)函數(shù)外處理的,盡可能在外部。
  • 必須正確管理多線程中的對(duì)象,避免某線程正在訪問的對(duì)象被另一線程清理,如用move方法使對(duì)象從一個(gè)線程正確移交給另一個(gè)線程,避免內(nèi)存泄漏。
  • 使用condition variable時(shí),必須增加條件判斷并在循環(huán)中等待。下例中,線程ReceivingUnPro中條件變量錯(cuò)過了通知,缺少條件判斷,就始終處于等待狀態(tài),而ReceivingPro依靠while判斷條件,解決了問題。
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>

std::condition_variable g_dataCond;
std::string g_words = "";
std::mutex g_mtx;
bool g_isReady = false;

void ReceivingUnpro() {
    std::unique_lock<std::mutex> lg(g_mtx);
    std::cout << "waiting!" << std::endl;
    g_dataCond.wait(lg);
    std::cout << "Bad receiving thread got the message: " << g_words
              << std::endl;
}
void ReceivingPro() {
    std::unique_lock<std::mutex> lg(g_mtx);
    while (!g_isReady) {
        g_dataCond.wait(lg);
    }
    std::cout << "Protected receiving thread got the message: " << g_words
              << std::endl;
}
void Sending() {
    std::lock_guard<std::mutex> lg(g_mtx);
    g_words.append("Go forward!");
    g_isReady = true;
    g_dataCond.notify_all();
}
int main() {
    std::thread b(Sending);
    b.join();
    std::thread ap(ReceivingPro);
    ap.join();
    std::thread a(ReceivingUnpro);
    a.join();
    return 0;
}

理論上,條件變量有虛假喚醒問題,所以要條件判斷避免。

  • 用std::lock_gaurd、std::unique_lock確保鎖被釋放,不要用std::mutex的lock()、unlock()以免遺忘或異常導(dǎo)致dead lock。
    錯(cuò)誤的例子,
#include <mutex>
std::mutex x;
{
    x.lock();
    // 處理數(shù)據(jù)的代碼
    // 發(fā)生異常,導(dǎo)致后面未執(zhí)行
    x.unlock(); 
}

下例中出現(xiàn)dead lock,文章來源地址http://www.zghlxwxcb.cn/news/detail-833455.html

#include <unistd.h>
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>

using std::cout;
using std::endl;
using std::lock_guard;
using std::mutex;
using std::chrono::seconds;

mutex m1, m2, m3;
std::condition_variable cnd;
std::mutex dt_mtx;
bool ready = false;
std::vector<int> vec_i;

void ProcessData() {
    for (const auto i : vec_i) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}

void T1F() {
    std::unique_lock<std::mutex> lock(dt_mtx);
    cnd.wait(lock, [] { return ready; });
    ProcessData();
}

void T2F() {
    {
        std::lock_guard<std::mutex> lock(dt_mtx);
        for (int i = 0; i < 10; i++) {
            vec_i.push_back(i);
            sleep(1);
        }
        ready = true;
    }
    cnd.notify_all();
}

void Fun1() {
    lock_guard<mutex> l1(m1);
    std::this_thread::sleep_for(seconds(1));
    lock_guard<mutex> l2(m2);
    std::this_thread::sleep_for(seconds(1));
    cout << "Fun1 is finishing" << endl;
}
void Fun2() {
    lock_guard<mutex> l1(m2);
    std::this_thread::sleep_for(seconds(1));
    lock_guard<mutex> l2(m3);
    std::this_thread::sleep_for(seconds(1));
    cout << "Fun2 is finishing" << endl;
}
void Fun3() {
    lock_guard<mutex> l1(m3);
    std::this_thread::sleep_for(seconds(1));
    lock_guard<mutex> l2(m1);
    std::this_thread::sleep_for(seconds(1));
    cout << "Fun3 is finishing" << endl;
}
int main() {
    std::thread t1(Fun1);
    std::thread t2(Fun2);
    std::thread t3(Fun3);
    if (t1.joinable()) {
        cout << "t1 is joining" << endl;
        t1.join();
    }
    if (t2.joinable()) {
        cout << "t2 is joining" << endl;
        t2.join();
    }
    if (t3.joinable()) {
        cout << "t3 is joining" << endl;
        t3.join();
    }
#ifdef VERSION1
    std::thread t1(T1F);
    std::thread t2(T2F);
    t1.join();
    t2.join();
#endif
    return 0;
}

對(duì)象與內(nèi)存管理

  • 避免訪問越界,如索引數(shù)組前判斷下標(biāo)是否超出數(shù)組區(qū)間。
  • 申請(qǐng)內(nèi)存要先檢查大小。
  • 數(shù)組作為函數(shù)參數(shù),若是已知的固定長度,建議用std::array;若不確定長度,傳遞來的數(shù)組表現(xiàn)為指針,則函數(shù)參數(shù)要加上數(shù)組長度,或者將數(shù)組的指針與長度封裝為一個(gè)類。
  • 避免函數(shù)返回其局部變量的地址,建議改為返回復(fù)制的值。
  • lambda的作用范圍超出局部時(shí),如用于線程等,按引用捕獲可能導(dǎo)致局部變量過早被清理,應(yīng)改為按值捕獲;應(yīng)明確捕獲的變量、合理的捕獲類型。

常量

  • 建議優(yōu)先用constexpr定義常量,編譯時(shí)硬編碼變量,提升效率;改關(guān)鍵字要求被修飾對(duì)象在編譯時(shí)可確定變量的值。
  • 使用const修飾函數(shù)內(nèi)部不會(huì)修改的參數(shù),類內(nèi)不變的變量、不修改不可變的成員變量的成員方法。
  • const實(shí)例化的對(duì)象,只允許調(diào)用其const方法。

到了這里,關(guān)于【編程】C++語言編程規(guī)范-2的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#編程語言的優(yōu)勢(shì)與C++對(duì)比

    ? ? ? ?C#語言是由 C/C++演變而來的,是微軟推出的一種基于.NET框架的、面向?qū)ο蟮母呒?jí)編程語言。以.NET框架類庫作為基礎(chǔ),擁有類似Visual Basic的快速開發(fā)能力。簡單易學(xué),入門超快,減少了煩人的指針,有統(tǒng)一的操作符/修飾符/運(yùn)算符,使用起來極其舒心。 ? ? ? ??對(duì)于

    2024年02月09日
    瀏覽(34)
  • 使用C++編寫自己的編程語言CASM

    CASM幫助文檔: CASM解釋器講解視頻: 我獨(dú)自開發(fā)了一種編程語言:CASM CASM解釋器源代碼(剪貼板有問題,總是粘貼成一行,哪位大佬幫幫我……): #include iostream #include cstring #include string #include cstdio #include map #include queue #include stack #include cstdlib #include list #include \\\"hint.hpp\\\" us

    2024年02月10日
    瀏覽(20)
  • 編程語言比拼之Java VS C++

    編程語言比拼之Java VS C++

    學(xué)Java還是C++? ? Java和C++都是非常受歡迎的編程語言,各有各的優(yōu)勢(shì)和適用場景。以下是對(duì)它們的簡要比較: 性能:C++通常被認(rèn)為是一種更高效的編程語言,適用于對(duì)性能要求較高的應(yīng)用程序,如游戲開發(fā)、嵌入式系統(tǒng)和高頻交易等。C++具有更接近底層的控制能力,允許開發(fā)

    2024年02月13日
    瀏覽(21)
  • C++ 編程入門指南:深入了解 C++ 語言及其應(yīng)用領(lǐng)域

    C++ 是一種跨平臺(tái)的編程語言,可用于創(chuàng)建高性能應(yīng)用程序。 C++ 是由 Bjarne Stroustrup 開發(fā)的,作為 C 語言的擴(kuò)展。 C++ 為程序員提供了對(duì)系統(tǒng)資源和內(nèi)存的高級(jí)控制。 該語言在 2011 年、2014 年、2017 年和 2020 年進(jìn)行了 4 次重大更新,分別為 C++11、C++14、C++17 和 C++20。 C++ 是世界上

    2024年03月21日
    瀏覽(33)
  • 中文編程開發(fā)語言工具構(gòu)件說明:屏幕截取構(gòu)件的編程操作

    中文編程開發(fā)語言工具構(gòu)件說明:屏幕截取構(gòu)件的編程操作

    屏幕截取 用于截取指定區(qū)域的圖像。 圖??? 標(biāo): 構(gòu)件類型:不可視 重要屬性 l??????? 截取類型 枚舉型,設(shè)置在截取屏幕時(shí)的截取類型。包括:全屏幕、指定區(qū)域、活動(dòng)窗口三種。當(dāng)全屏幕截取時(shí)相當(dāng)于執(zhí)行了硬拷屏(PrintScreenSysRq鍵)功能;指定區(qū)域截取則是通過矩形

    2024年02月07日
    瀏覽(21)
  • [編程語言][C++][Qt]單獨(dú)添加UI文件

    [編程語言][C++][Qt]單獨(dú)添加UI文件

    不知什么原因,Qt Creator并不是很完美很智能。當(dāng)先寫好界面類的頭文件和源代碼文件后,我們?cè)偬砑佑糜诳梢暬缑嬖O(shè)計(jì)的UI文件時(shí),會(huì)出現(xiàn)一些問題。 當(dāng)使用CMake管理項(xiàng)目時(shí),CMake會(huì)讀取 CMakeLists.txt 文件來確定各種項(xiàng)目設(shè)置。需要把 MainWindow.ui 包含進(jìn)項(xiàng)目時(shí),在 CMakeLists.

    2024年02月07日
    瀏覽(26)
  • 中文編程開發(fā)語言工具編程實(shí)際案例:美發(fā)店會(huì)員管理系統(tǒng)軟件編程實(shí)例

    中文編程開發(fā)語言工具編程實(shí)際案例:美發(fā)店會(huì)員管理系統(tǒng)軟件編程實(shí)例

    中文編程開發(fā)語言工具編程實(shí)際案例:美發(fā)店會(huì)員管理系統(tǒng)軟件編程實(shí)例 中文編程開發(fā)語言工具編程實(shí)際案例:美發(fā)店會(huì)員管理系統(tǒng)軟件編程實(shí)例。 軟件功能: 1、系統(tǒng)設(shè)置:參數(shù)設(shè)定,賬號(hào)及權(quán)限設(shè)置,系統(tǒng)初始化,卡類型設(shè)置,積分清零等。 2、會(huì)員信息登記:可以刷卡

    2024年02月07日
    瀏覽(34)
  • 最短路徑算法的編程與實(shí)現(xiàn) C語言

    最短路徑算法的編程與實(shí)現(xiàn) C語言

    1.掌握最短路徑算法的基本原理及編程實(shí)現(xiàn); operating system version:Win11 CPU instruction set: ?x64 Integrated Development Environment:Viusal Studio 2022 1)建立一張圖,選擇一種存儲(chǔ)結(jié)構(gòu)(鄰接矩陣或鄰接表)初始化該圖; 2)用Dijkstra算法實(shí)現(xiàn)點(diǎn)與點(diǎn)之間的最短路徑。 1) 實(shí)現(xiàn)圖的兩種表示方法;

    2024年02月11日
    瀏覽(22)
  • 掌握Go語言:Go語言遞歸函數(shù),解密編程之謎,探索算法的奧秘!(27)

    遞歸函數(shù)是指在函數(shù)內(nèi)部調(diào)用自身的函數(shù)。在Go語言中,遞歸函數(shù)使用起來非常方便,但需要注意遞歸的終止條件,以避免無限循環(huán)。 Go語言遞歸函數(shù)的使用方法 在Go語言中,編寫遞歸函數(shù)的基本步驟如下: 上述三點(diǎn)內(nèi)容詳細(xì)解釋如下: 定義一個(gè)函數(shù),函數(shù)內(nèi)部調(diào)用自身 :

    2024年04月15日
    瀏覽(103)
  • day3 驅(qū)動(dòng)開發(fā) c語言編程

    通過ioctl(內(nèi)核+應(yīng)用層) 控制led燈三盞,風(fēng)扇,蜂鳴器,小馬達(dá) 頭文件head.h 內(nèi)核代碼 ioctldev.c 應(yīng)用層代碼 ioctl.c

    2024年02月16日
    瀏覽(77)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包