首頁 資料庫 mysql教程 [RTT例程练习] 2.6 互斥锁 mutex

[RTT例程练习] 2.6 互斥锁 mutex

Jun 07, 2016 pm 03:17 PM
mutex 互斥 練習

互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。 这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。 例子中,线程2 一开始拥有

互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。

这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。

例子中,线程2 一开始拥有锁,因为线程2的优先级高。而后线程1一开始采用等待10个tick的方式,所以线程1等锁的时候一定会超时。最后线程2 等1秒之后释放锁,然后这时线程1再次试图拥有锁,就能成功拿到锁了。

代码:

#include <rtthread.h>

void rt_init_thread_entry(void *parameter)
{

}

static struct rt_mutex static_mutex;

static rt_mutex_t dynamic_mutex = RT_NULL;

static rt_uint8_t thread1_stack[1024];
struct rt_thread thread1;
static void rt_thread_entry1(void *parameter)
{
    rt_err_t result;
    rt_tick_t tick;
    
    /* static mutex demo */
    rt_kprintf("thread1 try to get static mutex, wait 10 ticks.\n");
    
    tick = rt_tick_get();
    
    result = rt_mutex_take(&static_mutex, 10);
    if (result == -RT_ETIMEOUT)
    {
        if (rt_tick_get() - tick != 10)
        {
            rt_mutex_detach(&static_mutex);
            return ;
        }
    }
    else
    {
        rt_kprintf("thread1 take a static mutex, failed.\n");
        rt_mutex_detach(&static_mutex);
        return ;
    }
    
    /* wait forever */
    rt_kprintf("thread1 try to get static mutex, wait forever.\n");
    result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
    if (result != RT_EOK)
    {
        rt_kprintf("thread1 take a static mutex, failed.\n");
        rt_mutex_detach(&static_mutex);
        return ;
    }
    
    rt_kprintf("thread1 take a static mutex, done.\n");
    
    rt_mutex_detach(&static_mutex);
    
    /* dynamic mutex test */
    rt_kprintf("thread1 try to get dynamic mutex, wait 10 ticks.\n");
    
    tick = rt_tick_get();
    
    result = rt_mutex_take(dynamic_mutex, 10);
    if (result == -RT_ETIMEOUT)
    {
        if (rt_tick_get() - tick != 10)
        {
            rt_mutex_delete(dynamic_mutex);
            return ;
        }
        rt_kprintf("thread1 take dynamic mutex timeout.\n");
    }
    else
    {
        rt_kprintf("thread1 take a dynamic mutex, failed.\n");
        rt_mutex_delete(dynamic_mutex);
        return ;
    }
    
    rt_kprintf("thread1 try to take dynamic mutex, wait forever.\n");
    result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
    if (result != RT_EOK)
    {
        rt_kprintf("thread1 take a dynamic mutex, failed.\n");
        rt_mutex_delete(dynamic_mutex);
        return ;
    }
    
    rt_kprintf("thread1 take a dynamic mutex,done.\n");
    rt_mutex_delete(dynamic_mutex);
}

static rt_uint8_t thread2_stack[1024];
struct rt_thread thread2;
static void rt_thread_entry2(void *parameter)\
{
    //rt_err_t result;
    //rt_tick_t tick;
    
    rt_kprintf("thread2 try to take static mutex.\n");
    rt_mutex_take(&static_mutex, 10);
    rt_kprintf("thread2 got static mutex.\n");
    rt_thread_delay(RT_TICK_PER_SECOND);
    rt_kprintf("thread2 release static mutex.\n");
    rt_mutex_release(&static_mutex);
    
    rt_kprintf("thread2 try to take dynamic mutex.\n");
    rt_mutex_take(dynamic_mutex, 10);
    rt_kprintf("thread2 got dynamic mutex.\n");
    rt_thread_delay(RT_TICK_PER_SECOND);
    rt_kprintf("thread2 release dynamic mutex.\n");
    rt_mutex_release(dynamic_mutex);
}

int rt_application_init()
{
    //rt_thread_t init_thread;
    rt_err_t result;
    
    result = rt_mutex_init(&static_mutex, "smutex", RT_IPC_FLAG_FIFO);
    if (result != RT_EOK)
    {
        rt_kprintf("init static mutex failed.\n");
        return -1;
    }
    dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO);
    if (dynamic_mutex == RT_NULL)
    {
        rt_kprintf("create dynamic mutex failed.\n");
        return -1;
    }

    rt_thread_init(&thread1,
                   "thread1",
                   rt_thread_entry1,
                   RT_NULL,
                   &thread1_stack[0],
                   sizeof(thread1_stack),11,5);
    rt_thread_startup(&thread1);


    rt_thread_init(&thread2,
                   "thread2",
                   rt_thread_entry2,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),10,5);
    rt_thread_startup(&thread2);
    return 0;
}</rtthread.h>
登入後複製

结果:
thread2 try to get static mutex
thread2 got static mutex
thread1 try to get static mutex, wait 10 ticks.
thread1 take static mutex timeout
thread1 try to get static mutex, wait forever.
thread2 release static mutex
thread2 try to get dynamic mutex
thread2 got dynamic mutex
thread1 take a staic mutex, done.
thread1 try to get dynamic mutex, wait 10 ticks.
thread1 take dynamic mutex timeout
thread1 try to get dynamic mutex, wait forever.
thread2 release dynamic mutex
thread1 take a dynamic mutex, done.
登入後複製


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

金山打字通怎麼練打字-金山打字通練習打字方法 金山打字通怎麼練打字-金山打字通練習打字方法 Mar 18, 2024 pm 04:25 PM

現在很多朋友喜歡用金山打字通這款軟體,那麼打字速度快慢嚴重影響工作效率,所以教大家練習打字速度,那麼如何使用金山打字通練打字呢?今天小編就將金山打字通練習打數字教程如下講述,希望對大家有幫助。首先,開啟金山打字軟體然後,滑鼠點擊(新手入門)按鈕接著,在新視窗中點擊(數字鍵位)按鈕隨後,點擊下方的(從頭開始)按鈕即可練習也可以點擊(測試模式)按鈕最後,輸入數字進行練習就可以了此外金山打字通還有其他功能,能幫助大家更好的練習打字。 1.選擇練習模式:在軟體介面上,您可以看到有不同的練習模式,例如「新

五筆打字初學者怎麼練-五筆輸入法打字練習 五筆打字初學者怎麼練-五筆輸入法打字練習 Mar 18, 2024 pm 06:30 PM

五筆打字,也稱為五筆字型輸入法,是一種高效率的漢字輸入方法。對於初學者來說,掌握五筆打字需要一定的時間和耐心,下面小編整理了五筆打字初學者的學習方法,一起來看看吧!一、理解五筆字型的原理五筆字型是一種基於筆畫和字根的輸入法。每個漢字都可以由不同的筆畫和字根組合而成。因此,學習五筆字型的關鍵是理解筆畫和字根的組合規律。在五筆字型中,有五個基本筆畫:橫、豎、撇、捺、折。這些基本筆畫可以組合成不同的字根,而字根又可以組合成完整的漢字。二、學習字根和鍵位在五筆字型中,每個字母鍵都對應一個或多個字根。因此

golang 編譯錯誤:'undefined: sync.Mutex' 如何解決? golang 編譯錯誤:'undefined: sync.Mutex' 如何解決? Jun 24, 2023 pm 06:12 PM

在使用golang開發過程中,編譯錯誤是很常見的問題。當遇到錯誤:"undefined:sync.Mutex"時,它意味著你嘗試使用一個叫做sync.Mutex的類型,這個類型沒有被正確的導入和聲明。那要如何解決這個問題呢?首先,我們要先了解什麼是sync.Mutex。 sync.Mutex是golang標準函式庫中的鎖類型,它用於實現臨界區的互斥存取。在g

C++ 函式在並發程式設計中的互斥和臨界區實作? C++ 函式在並發程式設計中的互斥和臨界區實作? Apr 28, 2024 am 08:42 AM

在並發程式設計中,互斥和臨界區用於防止資料競爭。互斥是一個資料結構,允許一次只有一個執行緒存取共享資源,具體實作如下:定義一個帶有原子標記的Mutex類別。使用test_and_set()方法加鎖,並使用clear()方法解鎖。臨界區是一段程式碼,一次只能有一個執行緒執行,具體實作如下:宣告一個互斥量。使用lock_guard包裝器在臨界區中存取共享資源。

Java中的正規表示式練習題 Java中的正規表示式練習題 Jun 16, 2023 pm 02:36 PM

在Java中,正規表示式是非常常用的技術之一,幾乎可以用於任何文字處理場景,如文字搜尋、擷取、分析、替換等。其強大的匹配能力可以大大提高開發效率,同時可以讓程式碼更加簡潔且易於維護。以下是一些Java中的正規表示式練習題,幫助大家熟練正規表示式的應用。符合中文字元正規表示式:[u4e00-u9fa5]解釋:中文字元的Unicode碼值範圍是從4e00到9f

C#開發中如何處理多執行緒同步和互斥訪問 C#開發中如何處理多執行緒同步和互斥訪問 Oct 08, 2023 pm 05:57 PM

C#開發中如何處理多執行緒同步和互斥訪問,需要具體程式碼範例在C#開發中,多執行緒的使用可以提高程式的並發性和效能。然而,多執行緒的並發執行也可能導致一些問題,如資料競爭和資源衝突等。為了解決這些問題,我們需要使用同步和互斥機制來確保執行緒之間的正確協作。同步是指多個執行緒按照一定的順序來執行,以確保執行緒之間的協作關係。互斥是指在同一時間只允許一個執行緒存取某個共享資源,

C#開發中如何處理多執行緒同步與互斥問題 C#開發中如何處理多執行緒同步與互斥問題 Oct 10, 2023 pm 03:42 PM

C#開發中如何處理多執行緒同步和互斥問題,需要具體程式碼範例概述:在C#中,多執行緒的使用成為了常見的開發需求。然而,由於多執行緒同時操作共享資源可能導致資料不一致或衝突的問題,因此需要使用同步和互斥機制來解決這些問題。本文將介紹在C#開發中如何處理多執行緒的同步和互斥問題,並提供具體的程式碼範例。執行緒同步的概念在多執行緒同時操作共享資源時,可能會出現資料不一致或衝突的

在Go語言中如何解決並發任務重排序問題? 在Go語言中如何解決並發任務重排序問題? Oct 09, 2023 pm 10:55 PM

在Go語言中如何解決並發任務重排序問題?在並發程式設計中,任務的執行順序往往是不確定的,這可能會導致一些問題,特別是對於有依賴關係的任務。在Go語言中,我們可以透過使用通道和協程來解決並發任務重排序問題。下面我們將詳細介紹如何實作。通常情況下,我們使用通道來實現任務的同步和通訊。在Go語言中,通道可以作為更高階的同步原語來保證任務的執行順序。透過使用有緩衝的

See all articles