最简单C++线程和互斥锁使用示例

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字远笔记等共享软件产品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天恩软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值