🌷🌷🌷🌷① 互斥锁和条件变量的使用
🌷🌷🌷🌷② 信号量的使用
🌷🌷🌷🌷③ 读写锁的使用
① 互斥锁和条件变量的使用
互斥锁和条件变量是C++中最常用的线程通信机制之一,可以帮助我们实现线程之间的同步和互斥。以下是一个经典的示例代码,演示了如何使用互斥锁和条件变量来实现线程之间的同步和互斥。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex g_mutex;
std::condition_variable g_cv;
bool g_ready = false;
void worker_thread()
{
std::unique_lock<std::mutex> lock(g_mutex);
while (!g_ready)
{
g_cv.wait(lock);
}
std::cout << "Worker thread is running" << std::endl;
}
int main()
{
std::thread t(worker_thread);
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> guard(g_mutex);
g_ready = true;
}
g_cv.notify_one();
t.join();
return 0;
}
在这个示例代码中,我们创建了一个worker_thread线程,该线程会等待g_ready变量变为true后才会继续执行。在主线程中,我们首先睡眠1秒钟,然后将g_ready变量设置为true,最后通过条件变量g_cv通知worker_thread线程继续执行。在worker_thread线程中,我们使用std::unique_lockstd::mutex来获取互斥锁g_mutex,并在while循环中等待g_ready变量变为true。如果g_ready变量为false,我们就调用g_cv.wait(lock)函数来挂起线程,直到收到条件变量的通知。当g_ready变量变为true后,主线程会通过g_cv.notify_one()函数发出通知,唤醒worker_thread线程,使其继续执行。最后,我们使用t.join()函数等待worker_thread线程执行完毕。