std::thread 是 C++11 标准库中引入的一个类,用于表示一个独立的执行线程。而 std::mutex 是 C++11 中提供的一种互斥锁,用于在多个线程间同步对共享数据的访问,以避免数据竞争和条件竞争。
下面将分别介绍 std::thread 和 std::mutex 的基本使用,并通过一个示例展示它们的结合使用。
std::thread 介绍
std::thread 用于创建一个新的线程,该线程执行指定的函数或可调用对象。其构造函数接受一个可调用对象(如函数指针、lambda 表达式、函数对象等)以及该可调用对象的参数。
示例代码:
#include <iostream>
#include <thread>
void hello() {
std::cout << "Hello from thread\n";
}
int main() {
// 创建新线程,执行 hello 函数
std::thread t(hello);
// 等待线程 t 执行完毕
t.join();
return 0;
}
std::mutex 介绍
std::mutex 是一种互斥锁,它提供了一种机制来保护共享数据,使得同一时间只有一个线程可以访问被保护的资源。
示例:使用 std::thread 和 std::mutex
下面是一个使用 std::thread 和 std::mutex 的示例,其中两个线程尝试修改同一个共享变量,并使用 std::mutex 来确保每次只有一个线程可以修改该变量。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex g_mtx; // 创建一个互斥锁
int g_counter = 0; // 共享变量
void increment(int n) {
for (int i = 0; i < n; ++i) {
// 自动加锁
std::lock_guard<std::mutex> lock(g_mtx);
++g_counter;
// lock 在这里自动解锁
}
}
int main() {
// 创建 t1、t2和t3 三个线程,执行 increment 函数,传递 1000 参数
std::thread t1(increment, 1000);
std::thread t2(increment, 1000);
std::thread t3(increment, 1000);
// 等待线程 t1、t2和t3 执行完毕退出
t1.join();
t2.join();
t3.join();
// 输出 g_counter 的值
std::cout << "Counter: " << g_counter << std::endl;
return 0;
}
在这个示例中,increment 函数被三个线程 t1、t2 和 t3 调用,每个线程尝试将 g_counter 增加 1000 次。使用 std::mutex 和 std::lock_guard 来确保在任何给定时间,只有一个线程可以修改 g_counter。std::lock_guard 是一个 RAII(Resource Acquisition Is Initialization)包装器,它自动在构造函数中加锁,在析构函数中解锁,从而简化了锁的管理。
注意事项
在实际编程中,应尽可能减少锁的粒度,以减少锁竞争和提高程序的性能。同时,也要避免死锁和活锁等问题。
-End-
#想了解更多精彩内容,关注下方公众号。
本人小杨哥:
超20年C++开发经验,独立软件开发;著名开源产品高并发C++应用服务器MYCP作者;开源企业即时通讯软件Entboost首席架构师;开发有WordBN字远笔记等共享软件产品。
标签:std,thread,示例,C++,互斥,mutex,increment,线程 From: https://blog.csdn.net/yanghz/article/details/141992866