新闻资讯

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻资讯列表

c++多线程加锁的有哪些方法,c语言多线程加锁

发布时间:2023-11-23 04:39:14

c++多线程加锁的有哪些方法

C++中多线程加锁的方法有多种,以下是常见的几种方法:

  1. 互斥锁(mutex):使用std::mutex类来实现,可使用lock()函数来获得锁,unlock()函数来释放锁。
#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. 条件变量(condition_variable):用于线程间的等待和唤醒操作,结合互斥锁使用。
#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)等。