在C++中,线程同步和锁机制主要通过标准库中的<mutex>、<shared_mutex>(C++17引入)等头文件提供。这些库提供了多种锁机制来管理对共享资源的访问,以防止数据竞争和确保线程安全。
下面列举了几种常见的锁类型,并给出每种锁的示例:
01、std::mutex
std::mutex是最基本的互斥锁,用于保护共享数据,防止多个线程同时访问同一资源。
示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex g_mtx;
void print_block(int n, char c) {
g_mtx.lock();
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << '\n';
g_mtx.unlock();
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
02、std::lock_guard
std::lock_guard是一个RAII(Resource Acquisition Is Initialization)风格的锁包装器,它在构造时自动加锁,在析构时自动解锁,简化了锁的管理。
示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex g_mtx;
void print_block(int n, char c) {
std::lock_guard<std::mutex> lck(g_mtx);
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << '\n';
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
03、std::unique_lock
std::unique_lock比std::lock_guard更灵活,支持延迟锁定、条件变量等高级用法。
示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex g_mtx;
void print_block(int n, char c) {
std::unique_lock<std::mutex> lck(g_mtx, std::defer_lock); // 延迟锁定
lck.lock();
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << '\n';
lck.unlock();
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
04、std::shared_mutex和std::shared_lock(C++17)
std::shared_mutex允许多个读者同时访问资源,但写者访问时必须是独占的。这对于读多写少的场景非常有用。
std::shared_lock 用于管理对共享互斥量(std::shared_timed_mutex 或 std::shared_mutex)的访问,允许多个线程同时以共享模式锁定互斥量,但只允许一个线程以独占模式锁定它。
示例:
#include <iostream>
#include <thread>
#include <shared_mutex>
std::shared_mutex g_smtx;
void reader(int id) {
std::shared_lock<std::shared_mutex> lck(g_smtx);
std::cout << "Reader " << id << " is reading\n";
}
void writer(int id) {
std::unique_lock<std::shared_mutex> lck(g_smtx);
std::cout << "Writer " << id << " is writing\n";
}
int main() {
std::thread t1(reader, 1);
std::thread t2(reader, 2);
std::thread t3(writer, 1);
t1.join();
t2.join();
t3.join();
return 0;
}
-End-
#想了解更多精彩内容,关注下方公众号。
本人小杨哥:
超20年C++开发经验,独立软件开发;著名开源产品高并发C++应用服务器MYCP作者;开源企业即时通讯软件Entboost首席架构师;开发有【WordBN字远笔记】等共享软件产品。