C++でマルチスレッドロックをする方法は?

C++でマルチスレッド処理を行う際にロック(排他制御)に使用できるメソッドは複数あります。以下に一般的なものを紹介します。

  1. std::mutex
  2. ロック()
  3. ロック解除する
#include <mutex>
#include <thread>

std::mutex mtx;

void threadFunction()
{
    std::lock_guard<std::mutex> lock(mtx); // 获取锁
    // 临界区代码
    // ...
    // 释放锁
}

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

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

    return 0;
}
  1. 再帰可能ロック(recursive_mutex):ミューテックスと同様だが、同じスレッドがロックを複数回取得できる。
#include <mutex>
#include <thread>

std::recursive_mutex mtx;

void threadFunction()
{
    std::lock_guard<std::recursive_mutex> lock(mtx); // 获取锁
    // 临界区代码
    // ...
    // 释放锁
}

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

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

    return 0;
}
  1. スレッド間における待ち受け・喚起操作を行うための条件変数。ミューテックスと組み合わせる。
#include <condition_variable>
#include <mutex>
#include <thread>

std::mutex mtx;
std::condition_variable cv;

void threadFunction()
{
    std::unique_lock<std::mutex> lock(mtx); // 获取锁
    // 等待条件满足
    cv.wait(lock);

    // 临界区代码
    // ...
    // 释放锁
}

int main()
{
    std::thread t1(threadFunction);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    
    // 唤醒等待线程
    cv.notify_one();

    t1.join();

    return 0;
}

上は頻繁に使用するマルチスレッドロックの方法で、具体的なニーズやシーンに応じて適切な方法を選択してください。同時に、読み取り書き込みロック(std::shared_mutex)やスピンロック(std::atomic_flag)などの他のロックメカニズムを使用することもできます。

bannerAds