[RTT例程练习] 2.6 互斥锁 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.

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









最近では、多くの友人が Kingsoft Typing Assistant を使用することを好みますが、タイピング速度は作業効率に大きく影響しますので、私はタイピング速度を練習することを教えます。それでは、Kingsoft Typing Assistant を使用してタイピングを練習する方法を教えてください。今日は、エディターが次のチュートリアルを提供します。 Kingsoft Typing Assistant を使って数字を入力する練習方法を以下に説明しますので、皆様のお役に立てれば幸いです。まず、Kingsoft タイピング ソフトウェアを開き、マウスで (はじめに) ボタンをクリックし、新しいウィンドウで (数字キー) ボタンをクリックしてから、下の (ゼロから始める) ボタンをクリックして練習するか、(テスト モード) ボタン。数字を入力するだけで練習できます。さらに、Kingsoft タイピング アシスタントには、タイピングの練習に役立つその他の機能もあります。 1. 練習モードを選択します。ソフトウェア インターフェイスでは、「新規」などのさまざまな練習モードがあることがわかります。

Wubi タイピングは、Wubi 入力方法としても知られ、効率的な漢字入力方法です。初心者にとって、Wubi タイピングを習得するには、ある程度の時間と忍耐が必要です。以下に、編集者が Wubi タイピング初心者向けの学習方法をまとめました。見てみましょう! 1. Wubi フォントの原理を理解する Wubi フォントは、フォントベースの一種です。 on 画数と部首の入力方法。各漢字は、異なる画数と部首で構成されます。したがって、Wubi フォントを学習する鍵は、ストロークと根文字の組み合わせルールを理解することです。 5 ストローク フォントには、水平、垂直、左、右、折りの 5 つの基本ストロークがあります。これらの基本的なストロークを組み合わせてさまざまな部首を作成し、さらにそれらを組み合わせて完全な漢字を作成することができます。 2. 部首とキーの位置を学ぶ Wubi フォントでは、各文字キーが 1 つ以上の部首に対応します。したがって

コンパイル エラーは、golang を使用した開発中に非常に一般的な問題です。 「未定義: sync.Mutex」というエラーが発生した場合は、正しくインポートおよび宣言されていない sync.Mutex という型を使用しようとしていることを意味します。では、この問題をどうやって解決すればいいのでしょうか?まず、sync.Mutex とは何かを理解する必要があります。 sync.Mutex は golang 標準ライブラリのロック タイプで、クリティカル セクションへの相互排他的アクセスを実装するために使用されます。 gで

同時プログラミングでは、データ競合を防ぐためにミューテックスとクリティカル セクションが使用されます。 Mutex は、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにするデータ構造です。具体的な実装は次のとおりです。 アトミック タグを使用して Mutex クラスを定義します。ロックするには test_and_set() メソッドを使用し、ロックを解除するには clear() メソッドを使用します。クリティカル セクションは、一度に 1 つのスレッドによってのみ実行できるコードのセクションです。具体的な実装は次のとおりです。ミューテックスを宣言します。 lock_guard ラッパーを使用して、重要なセクションの共有リソースにアクセスします。

Java では、正規表現は最も一般的に使用されるテクノロジの 1 つであり、テキストの検索、抽出、分析、置換など、ほぼすべてのテキスト処理シナリオで使用できます。その強力なマッチング機能により、開発効率が大幅に向上すると同時に、コードがより簡潔になり、保守が容易になります。以下は、正規表現の適用をマスターするのに役立つ、Java での正規表現の演習です。中国語文字を照合するための正規表現: [u4e00-u9fa5] 説明: 中国語文字の Unicode コード値の範囲は 4e00 から 9f です。

C# 開発でマルチスレッドの同期と相互排他的アクセスを処理する方法には、特定のコード サンプルが必要です。C# 開発では、マルチスレッドを使用すると、プログラムの同時実行性とパフォーマンスが向上します。ただし、複数のスレッドを同時に実行すると、データの競合やリソースの競合などの問題が発生する可能性があります。これらの問題を解決するには、同期および相互排他メカニズムを使用して、スレッド間の正しい連携を確保する必要があります。同期とは、スレッド間の協力関係を確保するために、複数のスレッドを特定の順序で実行することを指します。相互排他とは、同時に 1 つのスレッドのみが共有リソースにアクセスできることを意味します。

C# 開発でマルチスレッドの同期と相互排他の問題に対処する方法には、特定のコード例の概要が必要です。C# では、マルチスレッドの使用が一般的な開発要件になっています。ただし、共有リソースを同時に操作する複数のスレッドはデータの不整合や競合を引き起こす可能性があるため、これらの問題を解決するには同期および相互排他メカニズムを使用する必要があります。この記事では、C# 開発におけるマルチスレッドの同期と相互排他の問題に対処する方法を紹介し、具体的なコード例を示します。スレッド同期の概念 複数のスレッドが共有リソースを同時に操作すると、データの不整合や競合が発生する可能性があります。

Go 言語での同時タスクの並べ替えの問題を解決するにはどうすればよいですか?並行プログラミングでは、タスクの実行順序が不確実であることが多く、特に依存関係のあるタスクの場合に問題が発生する可能性があります。 Go 言語では、チャネルとコルーチンを使用して、同時タスクの並べ替えの問題を解決できます。以下では、これを実現する方法について詳しく説明します。通常、タスクの同期と通信を実現するためにチャネルを使用します。 Go 言語では、タスクの実行順序を保証するための高レベルの同期プリミティブとしてチャネルを使用できます。バッファリングを使用することで
