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

TinyWebServer學(xué)習(xí)筆記-互斥鎖、信號量、條件變量

這篇具有很好參考價(jià)值的文章主要介紹了TinyWebServer學(xué)習(xí)筆記-互斥鎖、信號量、條件變量。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

為什么要使用鎖、信號量、條件變量?

網(wǎng)站不可能是單線程的,否則網(wǎng)站的性能和響應(yīng)都會(huì)收到嚴(yán)重的影響。因此,這個(gè)項(xiàng)目一定是運(yùn)行在多線程條件下的。而在多線程條件下,對共享資源的互斥訪問就極其重要。

為什么要將資源封裝成類?

首先,我們要明確資源的使用一般有三個(gè)步驟:

1、獲取資源

2、使用資源

3、釋放資源

然而,大多數(shù)情況下,我們一定能做到前兩點(diǎn),而總是忘記第三步,這就會(huì)造成資源的泄露。為了解決這個(gè)問題,提出了RAII方案,中文翻譯是資源獲取即初始化,也就是使用局部對象來管理資源的技術(shù)。

最直觀的就是將資源封裝成類, 在構(gòu)造函數(shù)中獲取資源,在析構(gòu)函數(shù)中釋放資源,這樣當(dāng)變量離開了作用域后,編譯器會(huì)調(diào)用析構(gòu)函數(shù),而析構(gòu)函數(shù)會(huì)幫助我們將資源釋放掉,這樣就避免了我們忘記釋放資源的情況。

本項(xiàng)目中,作者就將鎖、互斥量、條件變量進(jìn)行了封裝。有以下好處:

  1. 自動(dòng)資源管理:RAII模式允許資源的獲取和釋放與對象的生命周期綁定在一起。當(dāng)對象被創(chuàng)建時(shí),資源被獲??;當(dāng)對象被銷毀時(shí),資源被釋放。這消除了手動(dòng)管理資源的需要,減少了錯(cuò)誤的機(jī)會(huì)。

  2. 異常安全性:RAII模式提供了異常安全性,因?yàn)橘Y源的釋放操作通常在對象的析構(gòu)函數(shù)中執(zhí)行。如果在使用資源的過程中發(fā)生異常,對象的析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,確保資源被正確釋放,防止資源泄漏。

  3. 避免忘記釋放資源:使用RAII模式,開發(fā)人員不需要顯式地記住在何處釋放資源。資源的釋放是自動(dòng)的,因此避免了因忘記釋放資源而引發(fā)的問題。

  4. 代碼可讀性:RAII模式使代碼更加清晰和容易理解。資源的獲取和釋放操作都在對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)中,使得代碼更加自文檔化。

  5. 資源的精確生命周期控制:RAII模式允許在對象的生命周期內(nèi)對資源的生命周期進(jìn)行精確的控制。資源在對象的構(gòu)造和析構(gòu)之間一直存在,不會(huì)在對象的其他方法之外被訪問。

  6. 并發(fā)安全性:RAII模式可以用于管理鎖、信號量等同步資源,確保線程安全性。資源在鎖住和釋放鎖時(shí)被獲取和釋放,從而避免了競態(tài)條件和死鎖等問題。

?互斥鎖、條件變量、信號量是如何工作的?

互斥鎖:提供互斥訪問的能力來確保同一時(shí)間只有一個(gè)線程能夠訪問共享資源。

? ? ? ? 1. 鎖初始化:創(chuàng)建鎖并進(jìn)行初始化;

? ? ? ? 2. 加鎖:當(dāng)線程需要訪問共享資源時(shí),嘗試獲取互斥鎖,如果已經(jīng)被別的線程占用,那么該線程會(huì)被阻塞,直到鎖可用;

? ? ? ? 3. 訪問共享資源:獲取鎖后,線程訪問共享資源;

? ? ? ? 4. 解鎖:該線程訪問完共享資源后,釋放互斥鎖,使其他等待的線程可以獲得鎖并訪問資源。

條件變量:通常和互斥鎖一起使用,條件變量用于等待某個(gè)條件滿足后再繼續(xù)執(zhí)行。

? ? ? ? 1. 等待條件:線程獲取互斥鎖后,發(fā)現(xiàn)條件不足,進(jìn)入阻塞狀態(tài),釋放互斥鎖,讓其他進(jìn)程可以訪問共享資源;

? ? ? ? 2. 喚醒等待進(jìn)程:當(dāng)條件滿足后,某個(gè)線程通過條件變量發(fā)出信號,喚醒一個(gè)或多個(gè)等待的線程,這些線程被喚醒后后會(huì)嘗試重新獲取互斥鎖。

信號量:用于控制多個(gè)線程對有限資源的訪問。通常有兩種:

? ? ? ? 1.二進(jìn)制信號量:非0即1,用于互斥訪問共享資源。等待信號量為1時(shí)獲得訪問權(quán),將信號量設(shè)置為0,訪問結(jié)束后將信號量值設(shè)為1;

? ? ? ? 2. 計(jì)數(shù)信號量:可以具有>1的值,控制多個(gè)線程對一組有限資源的訪問。線程獲得資源信號量值變小;釋放資源信號量值變大,當(dāng)信號量值為0時(shí)需要阻塞線程。

下面我們來看作者的源代碼:

#ifndef LOCKER_H
#define LOCKER_H

#include <exception>
#include <pthread.h>
#include <semaphore.h>

class sem
{
public:
    sem()
    {
        if (sem_init(&m_sem, 0, 0) != 0)
        {
            throw std::exception();
        }
    }
    sem(int num)
    {
        if (sem_init(&m_sem, 0, num) != 0)
        {
            throw std::exception();
        }
    }
    ~sem()
    {
        sem_destroy(&m_sem);
    }
    bool wait()
    {
        return sem_wait(&m_sem) == 0;
    }
    bool post()
    {
        return sem_post(&m_sem) == 0;
    }

private:
    sem_t m_sem;
};
class locker
{
public:
    locker()
    {
        if (pthread_mutex_init(&m_mutex, NULL) != 0)
        {
            throw std::exception();
        }
    }
    ~locker()
    {
        pthread_mutex_destroy(&m_mutex);
    }
    bool lock()
    {
        return pthread_mutex_lock(&m_mutex) == 0;
    }
    bool unlock()
    {
        return pthread_mutex_unlock(&m_mutex) == 0;
    }
    pthread_mutex_t *get()
    {
        return &m_mutex;
    }

private:
    pthread_mutex_t m_mutex;
};
class cond
{
public:
    cond()
    {
        if (pthread_cond_init(&m_cond, NULL) != 0)
        {
            //pthread_mutex_destroy(&m_mutex);
            throw std::exception();
        }
    }
    ~cond()
    {
        pthread_cond_destroy(&m_cond);
    }
    bool wait(pthread_mutex_t *m_mutex)
    {
        int ret = 0;
        //pthread_mutex_lock(&m_mutex);
        ret = pthread_cond_wait(&m_cond, m_mutex);
        //pthread_mutex_unlock(&m_mutex);
        return ret == 0;
    }
    bool timewait(pthread_mutex_t *m_mutex, struct timespec t)
    {
        int ret = 0;
        //pthread_mutex_lock(&m_mutex);
        ret = pthread_cond_timedwait(&m_cond, m_mutex, &t);
        //pthread_mutex_unlock(&m_mutex);
        return ret == 0;
    }
    bool signal()
    {
        return pthread_cond_signal(&m_cond) == 0;
    }
    bool broadcast()
    {
        return pthread_cond_broadcast(&m_cond) == 0;
    }

private:
    //static pthread_mutex_t m_mutex;
    pthread_cond_t m_cond;
};
#endif

互斥鎖和信號量是簡單的封裝,而對于條件變量作者注釋掉了互斥鎖,但并不會(huì)影響互斥訪問,因?yàn)樽髡哌x擇用封裝好的互斥鎖并且在外部來使用。例如在block_queue.h這個(gè)文件中,作者將locker m_mutex;作為私有數(shù)據(jù)成員,并通過get函數(shù)獲得該鎖。文章來源地址http://www.zghlxwxcb.cn/news/detail-729122.html

template <class T>
class block_queue
{
public:
    ...
    if (!m_cond.timewait(m_mutex.get(), t))
    {
        m_mutex.unlock();
        return false;
    }
    ...
private:
    locker m_mutex;
    ...
}

到了這里,關(guān)于TinyWebServer學(xué)習(xí)筆記-互斥鎖、信號量、條件變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請?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)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • FreeRTOS源碼分析-10 互斥信號量

    FreeRTOS源碼分析-10 互斥信號量

    目錄 ? 1 事件標(biāo)志組概念及其應(yīng)用 1.1 事件標(biāo)志組定義 1.2 FreeRTOS事件標(biāo)志組介紹 1.3 FreeRTOS事件標(biāo)志組工作原理 2 事件標(biāo)志組應(yīng)用 2.1 功能需求 2.2 API ?2.3 功能實(shí)現(xiàn) 3 事件標(biāo)志組原理 3.1 事件標(biāo)志組控制塊 3.2 事件標(biāo)志組獲取標(biāo)志位 3.3?等待事件標(biāo)志觸發(fā) 3.4 事件標(biāo)志組設(shè)置標(biāo)志

    2024年02月14日
    瀏覽(17)
  • 【系統(tǒng)編程】線程安全(POSIX信號量、互斥鎖、讀寫鎖等)

    【系統(tǒng)編程】線程安全(POSIX信號量、互斥鎖、讀寫鎖等)

    (??? ),Hello我是 祐言QAQ 我的博客主頁:C/C++語言,數(shù)據(jù)結(jié)構(gòu),Linux基礎(chǔ),ARM開發(fā)板,網(wǎng)絡(luò)編程等領(lǐng)域UP?? 快上??,一起學(xué)習(xí),讓我們成為一個(gè)強(qiáng)大的攻城獅! 送給自己和讀者的一句雞湯??: 集中起來的意志可以擊穿頑石! 作者水平很有限,如果發(fā)現(xiàn)錯(cuò)誤,請?jiān)谠u論區(qū)指

    2024年02月10日
    瀏覽(106)
  • FreeRTOS的二值信號量和互斥量之間的區(qū)別和聯(lián)系

    目錄 1. 二值信號量和互斥量的作用 1.1 二值信號量的作用 1.2 互斥量的作用 2. FreeRTOS二值信號量和互斥鎖關(guān)系 2.1 不同點(diǎn) 2.2 相同點(diǎn) 3. 如何選擇 3.1?根據(jù)場景選擇合適的同步機(jī)制 3.2?根據(jù)優(yōu)先級設(shè)計(jì)同步機(jī)制 FreeRTOS是一款廣泛應(yīng)用于嵌入式系統(tǒng)中的實(shí)時(shí)操作系統(tǒng),其中信號量(

    2024年02月06日
    瀏覽(30)
  • 二、操作系統(tǒng)進(jìn)程管理(10)——用信號量機(jī)制實(shí)現(xiàn)進(jìn)程互斥、同步、前驅(qū)關(guān)系

    二、操作系統(tǒng)進(jìn)程管理(10)——用信號量機(jī)制實(shí)現(xiàn)進(jìn)程互斥、同步、前驅(qū)關(guān)系

    ?? ?(1)分析并發(fā)進(jìn)程的關(guān)鍵活動(dòng),劃定臨界區(qū)。(如對臨界區(qū)資源打印機(jī)的訪問就應(yīng)放在臨界區(qū)) ?? ?(2)設(shè)置互斥信號量mutex,初值為1。 ?? ?(3)在臨界區(qū)之前執(zhí)行P(mutex)。? ? ? //即使用資源前先申請(P操作) ?? ?(4)在臨界區(qū)之后執(zhí)行V(mutex)。 ?? ?(5)對不

    2023年04月08日
    瀏覽(18)
  • STM32 CubeMX (第二步Freertos任務(wù)通信:隊(duì)列、信號量、互斥量,事件組,任務(wù)通知)

    STM32 CubeMX (第二步Freertos任務(wù)通信:隊(duì)列、信號量、互斥量,事件組,任務(wù)通知)

    學(xué)習(xí)使用Freertos第二步 在 FreeRTOS 中,任務(wù)通信可以通過以下函數(shù)來實(shí)現(xiàn): xQueueCreate() :用于創(chuàng)建一個(gè)消息隊(duì)列。可以設(shè)置隊(duì)列長度和每個(gè)消息的大小。 xQueueSend() :將一條消息發(fā)送到隊(duì)列中??梢赃x擇阻塞或非阻塞發(fā)送。 xQueueReceive() :從隊(duì)列中接收一條消息??梢赃x擇阻塞

    2024年02月11日
    瀏覽(23)
  • 【Linux】詳解進(jìn)程通信中信號量的本質(zhì)&&同步和互斥的概念&&臨界資源和臨界區(qū)的概念

    【Linux】詳解進(jìn)程通信中信號量的本質(zhì)&&同步和互斥的概念&&臨界資源和臨界區(qū)的概念

    ???????? 訪問資源在安全的前提下,具有一定的順序性,就叫做同步 。在多道程序系統(tǒng)中,由于資源有限,進(jìn)程或線程之間可能產(chǎn)生沖突。同步機(jī)制就是為了解決這些沖突,保證進(jìn)程或線程之間能夠按照既定的順序訪問共享資源。同步機(jī)制有助于避免競態(tài)條件和死鎖(

    2024年04月25日
    瀏覽(91)
  • 第三章 Linux多線程開發(fā) 線程取消 屬性 同步 互斥鎖 死鎖 讀寫鎖 生產(chǎn)者消費(fèi)者 信號量
  • 【小黑嵌入式系統(tǒng)第十二課】μC/OS-III程序設(shè)計(jì)基礎(chǔ)(二)——系統(tǒng)函數(shù)使用場合、時(shí)間管理、臨界區(qū)管理、使用規(guī)則、互斥信號量

    【小黑嵌入式系統(tǒng)第十二課】μC/OS-III程序設(shè)計(jì)基礎(chǔ)(二)——系統(tǒng)函數(shù)使用場合、時(shí)間管理、臨界區(qū)管理、使用規(guī)則、互斥信號量

    上一課: 【小黑嵌入式系統(tǒng)第十一課】μC/OS-III程序設(shè)計(jì)基礎(chǔ)(一)——任務(wù)設(shè)計(jì)、任務(wù)管理(創(chuàng)建基本狀態(tài)內(nèi)部任務(wù))、任務(wù)調(diào)度、系統(tǒng)函數(shù) 下一課: 【小黑嵌入式系統(tǒng)第十三課】PSoC 5LP第二個(gè)實(shí)驗(yàn)——中斷控制實(shí)驗(yàn) 1.1 時(shí)間管理 1.1.1 控制任務(wù)的執(zhí)行周期 在任務(wù)函數(shù)的代碼

    2024年02月04日
    瀏覽(19)
  • 【STM32】FreeRTOS消息隊(duì)列和信號量學(xué)習(xí)

    【STM32】FreeRTOS消息隊(duì)列和信號量學(xué)習(xí)

    一、消息隊(duì)列(queue) 隊(duì)列是一種用于實(shí)現(xiàn)任務(wù)與任務(wù)之間,任務(wù)與中斷之間消息交流的機(jī)制。 注意:1.數(shù)據(jù)的操作是FIFO模式。 2.隊(duì)列需要明確數(shù)據(jù)的大小和隊(duì)列的長度。 3.寫和讀都會(huì)出現(xiàn)堵塞。 實(shí)驗(yàn):創(chuàng)建一個(gè)消息隊(duì)列,兩個(gè)發(fā)送任務(wù),一個(gè)接收任務(wù)。 其中任務(wù)一任務(wù)三

    2024年02月13日
    瀏覽(17)
  • RT_Thread內(nèi)核機(jī)制學(xué)習(xí)(六)信號量

    RT_Thread內(nèi)核機(jī)制學(xué)習(xí)(六)信號量

    要傳輸較大數(shù)據(jù)時(shí),使用隊(duì)列。 傳輸較小數(shù)值時(shí),使用郵箱。 隊(duì)列、郵箱用來傳遞數(shù)據(jù)。 如果只是用來傳遞資源的個(gè)數(shù),可以使用信號量。 A車與B車只需要傳遞信號量(代表資源)。 獲取信號量 如果value0,value–,return OK;如果value 0,timeout 0,return -ETIMEOUT;如果value==0,ti

    2024年02月10日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包