C++ でのマルチスレッド プログラミング スキル

王林
リリース: 2023-08-21 21:00:44
オリジナル
903 人が閲覧しました

コンピュータ ハードウェアの継続的な改善に伴い、プログラムのパフォーマンスと応答速度を向上させるために、ますます多くのソフトウェアがマルチスレッド テクノロジを使用し始めています。 C 言語はマルチスレッド プログラミングをサポートする言語です。この記事では、C でのマルチスレッド プログラミング手法をいくつか紹介します。

  1. マルチスレッドの概念を理解する

マルチスレッド プログラミングを行う前に、スレッドとは何かを理解する必要があります。スレッドはプログラム実行の最小単位であり、独自のプログラム カウンタ、レジスタ セット、スタックを持ち、プロセスのコード セグメント、データ セグメント、リソースを共有します。マルチスレッド プログラミングでは、複数のスレッドを同時に実行でき、これらのスレッドは同時に実行できます。

  1. ミューテックス ロックを使用して共有リソースを保護する

マルチスレッド プログラミングでは、複数のスレッドが同じ共有リソースに同時にアクセスすることがあります。これによりデータの不整合が生じる可能性があるため、共有リソースを保護するためにミューテックスを使用する必要があります。ミューテックスは、複数のスレッドが同じリソースを共有できるようにする同期プリミティブですが、そのリソースにアクセスできるのは 1 つのスレッドだけです。 C 標準ライブラリは、ミューテックス ロック メカニズムをサポートする std::mutex クラスを提供します。

たとえば、次のコード スニペットを使用して、変数の読み取りおよび書き込み操作を保護できます:

#include <mutex>
#include <iostream>

std::mutex mtx; // 申明一个互斥锁

int main()
{
    int count = 0;
    std::thread t1([&count]() {
        for (int i = 0; i < 1000000; i++) {
            mtx.lock(); // 加锁
            count++;
            mtx.unlock(); // 解锁
        }
    });

    std::thread t2([&count]() {
        for (int i = 0; i < 1000000; i++) {
            mtx.lock(); // 加锁
            count++;
            mtx.unlock(); // 解锁
        }
    });

    t1.join();
    t2.join();

    std::cout << "count: " << count << std::endl;
    return 0;
}
ログイン後にコピー

上記のコードでは、std::mutex オブジェクトを作成することで count を保護します。 mtx 変数に対する読み取りおよび書き込み操作。 mtx.lock() 関数を使用して mtx オブジェクトをロックし、他のスレッドが count 変数にアクセスすることを禁止します。 mtx.unlock() 関数を使用すると、mtx オブジェクトのロックを解除し、他のスレッドが count 変数にアクセスできるようにします。

  1. 条件変数を使用してスレッドを待機し通知する

マルチスレッド プログラミングでは、実行を続行する前に特定の条件が満たされるまで待機する必要がある場合があります。この場合、条件変数を使用して他のスレッドを待機し、通知することができます。

条件変数は、スレッドがビジー状態で待機するのではなく、特定のイベントを待機できるようにする同期メカニズムです。スレッドが条件変数を待機している場合、別のスレッドが条件変数を介して通知するまでスリープ状態になります。 C 標準ライブラリは、条件変数メカニズムをサポートする std::condition_variable クラスを提供します。

たとえば、次のコード スニペットを使用してスレッドを待機し、通知することができます:

#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>

std::mutex mtx;
std::condition_variable cv;
bool is_ready = false;

void work()
{
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return is_ready; }); // 等待条件变量满足
    std::cout << "Work started!" << std::endl;
}

int main()
{
    std::thread t(work);

    std::this_thread::sleep_for(std::chrono::seconds(2));

    {
        std::lock_guard<std::mutex> lock(mtx);
        is_ready = true;
    }

    cv.notify_one(); // 通知工作线程条件变量
    t.join();
    return 0;
}
ログイン後にコピー

上記のコードでは、ワーカー スレッド t を作成し、 std::unique_lockmutex ロックを保護します。スレッド t は、実行を続行する前に、条件変数が満たされるのを待ちます。メインスレッドでは、std::lock_guard を使用してミューテックスをロックし、is_ready 変数の値を変更し、cv.notify_one() を通じて t 条件変数が満たされたことをスレッドに通知します。

  1. std::atomic を使用してアトミックな操作を保証する

マルチスレッド プログラミングでは、通常、複数のスレッドが同じ変数を同時に変更します。この場合、変数に対する操作がアトミックであることを確認する必要があります。 C 標準ライブラリは、アトミック操作をサポートする std::atomic 型を提供します。

std::atomic タイプは、操作がアトミックであることを保証できます。つまり、一連の操作がいかなる状況でも他のスレッドによって中断されないことを保証します。 std::atomic クラスを使用して、競合状態やその他のマルチスレッド関連の問題を回避します。

たとえば、次のコード スニペットを使用して、std::atomic の使用方法を示すことができます。

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> counter(0); // 申明一个原子性变量

void func()
{
    for (int i = 0; i < 1000000; ++i) {
        counter++; // 自增操作
    }
}

int main()
{
    std::thread t1(func);
    std::thread t2(func);

    t1.join();
    t2.join();

    std::cout << "counter: " << counter << std::endl;
    return 0;
}
ログイン後にコピー

上記のコードでは、2 つのスレッド t1 と t2 を作成し、std を使用します。タイプ:atomic のカウンター変数。これにより、カウンター変数に対してアトミック操作を実行できるようになり、複数のスレッドが変数を同時に変更するという問題が回避されます。

概要

この記事では、C でのマルチスレッド プログラミング手法をいくつか紹介します。ミューテックスと条件変数を使用すると、共有リソースを保護し、スレッド通信を実装できます。また、std::atomic を使用すると、アトミックな操作を保証し、マルチスレッド関連の問題を回避できます。マルチスレッド プログラミングを使用する場合は、スレッドの安全性と正確性に注意し、共有リソースに対する操作がアトミックであることを確認してください。

以上がC++ でのマルチスレッド プログラミング スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート