当前位置:首页 > 科技  > 软件

C++多线程中的互斥锁

来源: 责编: 时间:2024-06-24 09:11:39 70观看
导读在多线程编程中,互斥锁(mutex)是确保线程安全、避免数据竞争的重要工具。C++标准库提供了多种互斥锁,每种都有其特定的应用场景和特点。主要有以下几种互斥锁(Mutex):std::mutex:最基本的互斥锁,用于保护临界区,确保同一时间只

在多线程编程中,互斥锁(mutex)是确保线程安全、避免数据竞争的重要工具。C++标准库提供了多种互斥锁,每种都有其特定的应用场景和特点。0YW28资讯网——每日最新资讯28at.com

0YW28资讯网——每日最新资讯28at.com

主要有以下几种互斥锁(Mutex):0YW28资讯网——每日最新资讯28at.com

  • std::mutex:最基本的互斥锁,用于保护临界区,确保同一时间只有一个线程可以访问被保护的资源。
  • std::timed_mutex:支持超时机制的互斥锁,可以尝试在给定时间内锁定互斥锁。如果在指定时间内没有成功获取锁,则返回失败。
  • std::recursive_mutex:递归互斥锁,同一线程可以多次获取锁而不会发生死锁,通常用于递归函数中。
  • std::recursive_timed_mutex:支持超时机制的递归互斥锁,结合了递归锁和超时锁的特性。
  • std::shared_mutex(C++17 引入):允许多个线程同时读取,但只有一个线程可以写入。适用于读多写少的场景。
  • std::shared_timed_mutex(C++17 引入):支持超时机制的共享互斥锁,可以在给定时间内尝试获取读锁或写锁。

这些是C++标准库中提供的几种主要的互斥锁类型。每种锁都有其特定的应用场景和使用方法,选择合适的互斥锁类型对于实现高效、安全的多线程程序非常重要。0YW28资讯网——每日最新资讯28at.com

一、基本互斥锁(std::mutex)

std::mutex是最基本的互斥锁,主要用于保护临界区,确保同一时间只有一个线程可以访问共享资源。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 简单易用,适用于大多数场景。
  • 不能递归锁定,同一线程多次尝试锁定会导致死锁。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <mutex>std::mutex mtx;void print_thread_id(int id) {    std::lock_guard<std::mutex> lock(mtx); // 自动管理锁的获取和释放    std::cout << "Thread ID: " << id << std::endl;}int main() {    std::thread t1(print_thread_id, 1);    std::thread t2(print_thread_id, 2);    t1.join();    t2.join();    return 0;}

0YW28资讯网——每日最新资讯28at.com

二、带超时机制的互斥锁(std::timed_mutex)

std::timed_mutex在std::mutex的基础上增加了超时功能,允许线程在指定时间内尝试获取锁,如果在超时时间内未成功获取锁,则返回失败。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 适用于需要设置锁获取超时时间的场景。
  • 提供try_lock_for和try_lock_until两种超时尝试获取锁的方法。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <mutex>#include <chrono>std::timed_mutex tmtx;void try_to_lock(int id) {    if(tmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " locked the mutex" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(200));        tmtx.unlock();    } else {        std::cout << "Thread " << id << " could not lock the mutex" << std::endl;    }}int main() {    std::thread t1(try_to_lock, 1);    std::thread t2(try_to_lock, 2);    t1.join();    t2.join();    return 0;}

0YW28资讯网——每日最新资讯28at.com

三、递归互斥锁(std::recursive_mutex)

std::recursive_mutex允许同一线程多次获取锁而不会发生死锁,这对于递归函数或需要多次锁定的场景非常有用。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 适用于递归调用和需要多次锁定的场景。
  • 需要注意避免滥用,因为递归锁的使用会增加锁定次数的复杂性。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <mutex>std::recursive_mutex rmtx;void recursive_function(int depth) {    rmtx.lock();    std::cout << "Depth: " << depth << std::endl;    if (depth > 0) {        recursive_function(depth - 1);    }    rmtx.unlock();}int main() {    std::thread t(recursive_function, 5);    t.join();    return 0;}

0YW28资讯网——每日最新资讯28at.com

四、带超时机制的递归互斥锁(std::recursive_timed_mutex)

std::recursive_timed_mutex结合了std::recursive_mutex和std::timed_mutex的特性,支持递归锁定和超时机制。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 适用于递归调用和需要超时机制的场景。
  • 提供超时尝试获取递归锁的方法。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <mutex>#include <chrono>std::recursive_timed_mutex rtmmtx;void try_recursive_lock(int id, int depth) {    if (rtmmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " locked at depth " << depth << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        if (depth > 0) {            try_recursive_lock(id, depth - 1);        }        rtmmtx.unlock();    } else {        std::cout << "Thread " << id << " could not lock at depth " << depth << std::endl;    }}int main() {    std::thread t1(try_recursive_lock, 1, 3);    std::thread t2(try_recursive_lock, 2, 3);    t1.join();    t2.join();    return 0;}

0YW28资讯网——每日最新资讯28at.com

五、共享互斥锁(std::shared_mutex)

std::shared_mutex允许多个线程同时读取,但只有一个线程可以写入。这在读多写少的场景下非常有用。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 适用于读多写少的场景。
  • 读操作和写操作使用不同的锁定机制。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <shared_mutex>std::shared_mutex shmtx;void read_shared(int id) {    std::shared_lock<std::shared_mutex> lock(shmtx); // 共享锁    std::cout << "Thread " << id << " is reading" << std::endl;    std::this_thread::sleep_for(std::chrono::milliseconds(100));}void write_shared(int id) {    std::unique_lock<std::shared_mutex> lock(shmtx); // 独占锁    std::cout << "Thread " << id << " is writing" << std::endl;    std::this_thread::sleep_for(std::chrono::milliseconds(100));}int main() {    std::thread readers[5], writer(write_shared, 1);    for (int i = 0; i < 5; ++i) {        readers[i] = std::thread(read_shared, i + 2);    }    writer.join();    for (auto& reader : readers) {        reader.join();    }    return 0;}

0YW28资讯网——每日最新资讯28at.com

六、带超时机制的共享互斥锁(std::shared_timed_mutex)

std::shared_timed_mutex结合了std::shared_mutex和std::timed_mutex的特性,支持超时机制。0YW28资讯网——每日最新资讯28at.com

特点:0YW28资讯网——每日最新资讯28at.com

  • 适用于读多写少且需要超时机制的场景。
  • 提供超时尝试获取共享锁的方法。

示例代码:0YW28资讯网——每日最新资讯28at.com

#include <iostream>#include <thread>#include <shared_mutex>#include <chrono>std::shared_timed_mutex shtmmtx;void try_read_shared(int id) {    if (shtmmtx.try_lock_shared_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " is reading" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        shtmmtx.unlock_shared();    } else {        std::cout << "Thread " << id << " could not read" << std::endl;    }}void try_write_shared(int id) {    if (shtmmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " is writing" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        shtmmtx.unlock();    } else {        std::cout << "Thread " << id << " could not write" << std::endl;    }}int main() {    std::thread readers[5], writer(try_write_shared, 1);    for (int i = 0; i < 5; ++i) {        readers[i] = std::thread(try_read_shared, i + 2);    }    writer.join();    for (auto& reader : readers) {        reader.join();    }    return 0;}

0YW28资讯网——每日最新资讯28at.com

总结

C++标准库提供了多种类型的互斥锁,每种锁都有其特定的用途和特点。选择合适的互斥锁类型可以有效提高程序的并发性能和安全性。0YW28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-95917-0.htmlC++多线程中的互斥锁

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go 1.23:拥抱iter包,简化你的迭代逻辑

下一篇: C++ vs Rust vs Go 性能比较

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top
Baidu
map