C言語のスクラップ3:純粋なソフトウェアを使用してMutexミューテックスマルチスレッドを置き換える

I.はじめに

前回の記事では、クリティカルセクションの保護機能を実現するために純粋なソフトウェアアルゴリズムが導入されました。記事のリンク:C言語のスクラップ2:純粋なソフトウェアを使用してミューテックスミューテックスを置き換えます。

場合:まず第一に、それを明確にするミューテックスオペレーティングシステムによって提供されるが、私は必要な機能を実現することができ、私はなります間違いなくミューテックスを使用することが多いので、ピーターソンのアルゴリズムが導入された理由は、主である。面白いと小さな、どの缶「規範的な」プログラミング以外のいくつかのアイデアを私たちにもたらします。

バックグラウンドでこのアルゴリズムについてコメントを投稿している友人もいます。彼らが良いアイデアを持っている限り、彼らはそれについて考えないことを恐れています。

私の友人の一人は、このアルゴリズムは2つのスレッドでしか使用できないと述べましたが複数のスレッドで使用できる他の同様のアルゴリズムはありますか?

夕方に仕事を辞めた後、私は少し時間を取って以下のアルゴリズムを見つけて共有しました!

2、MichaHofriアルゴリズム

このアルゴリズムの名前が見つからなかったので、とりあえず作者の名前でこのアルゴリズムを呼びましょう!

アルゴリズムのスクリーンショット:

アルゴリズムのメインコードから、Hofriアルゴリズムは主にPetersonアルゴリズム拡張し2つのグローバル変数配列使用して、どのスレッドがクリティカルセクションに入ることができるかを制御します。

このアルゴリズムの議論はもっと複雑で、すべて数学的な証明です。記事はここにあります:相互排除アルゴリズムの証明- 1989年に公開された「古典的な例」。興味のある友人は自分の頭脳で勉強することができます。

3、テストコード

// 线程操作的资源
static int num = 0;

// 创建 10 个线程
#define THREAD_NUM      10

// 这 2 个全局变量控制算法
int flag[THREAD_NUM] = {0 };
int turn[THREAD_NUM - 1] = {0};

// 这是线程函数
void *thread_routine(void *arg)
{
    int index = *(int *)arg;

    for (int i = 0; i < 10000; ++i)
    {
        for (int j = 1; j < THREAD_NUM - 1; j++)
        {
            flag[index] = j;
            turn[j] = index;
    L:
            for (int k = 1; k < THREAD_NUM; ++k)
            {
                if (k == index) continue;
                if ((flag[k] >= j) && turn[j] == index)
                    goto L;
            }

        }

        flag[index] = THREAD_NUM;
        
        // 关键代码段
        num++;
        
        flag[index] = 0;
    }
    return NULL;
}

void test()
{
    // 用来传递线程的索引
    int index[THREAD_NUM] = {0};
    
    创建多个线程,执行同一个函数
    pthread_t t[THREAD_NUM];
    for (int i = 0; i < THREAD_NUM; ++i)
    {
        index[i] = i;
        pthread_create(&t[i], NULL, thread_routine, &index[i]);
    }
}

コンパイルして実行します。すべてのスレッドが実行された後、共有リソースのnum変数は正しい結果を得ることができます。

4、まとめ

記事の冒頭で述べたことを繰り返します。ここでのアルゴリズムは、クリティカルセクションを保護する機能を完了できることを示しているだけですが、実際のプロジェクトでは、このように使用すること実際には推奨されていません。コードの保守性は非常に重要です!



推奨読書

[C言語]
1。C言語ポインター-基本的な原則から高度なスキルまで、完全に説明するのに役立つ画像とコード付き
2.元のgdbの基本的なデバッグ原則はとてもシンプルです
3.ステップバイステップの分析-Cを使用してオブジェクト指向プログラミングを実現する
4.コード強制を改善するための武器:マクロ定義-エントリから放棄まで
5. C言語でsetjmpとlongjmpを使用して、例外のキャプチャとルーチンを実装する

【アプリケーション設計】
1.ソフトウェアアーキテクチャを階層化してモジュールに分割する必要があるとの意見とその方法(1)
2。ソフトウェアアーキテクチャを階層化してモジュールに分割する必要があるとの意見とその方法(2)
3。IoT
ゲートウェイ開発:MQTTメッセージバスベースの設計プロセス(パート1)4。IoTゲートウェイ開発:MQTTメッセージバスベースの設計プロセス(パート2)
5。プロセス間の私のお気に入りの通信方法-メッセージバス

【オペレーティングシステム】
1.なぜ宇宙船やミサイルは、組み込みシステムではなくマイクロコントローラーを好むのですか?

[
モノのインターネット] 1。暗号化と証明書に関するもの
2.LUAスクリプト言語を深め、デバッグの原理を完全に理解できるようにする

[ナンセンス] 1。私の失敗したキャリア経験に基づく
:職場に不慣れな技術者のためのいくつかのヒント

おすすめ

転載: blog.csdn.net/u012296253/article/details/115366917