Modern C++ std::mutex底层原理

这篇具有很好参考价值的文章主要介绍了Modern C++ std::mutex底层原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我时常有这样的疑问:

  1. std::mutex怎么就能保证后面的语句100%安全哪?
  2. CPU reordering就不会把这些语句重排到mutex前面执行?
  3. 而且各个CPU都是有L1、L2缓存的,如果mutex后面要访问的的变量在这些缓存中怎么办?

带着这些疑问我们先看看std::mutex是怎么实现的。

std::mutex::lock流程图

先给个图,再细说。

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

底层原理

先写个简单的cpp程序:

#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::lock_guard, std::adopt_lock

std::mutex mtx;           // mutex for critical section
int total=0;

void print_thread_id(int id) {
        mtx.lock();
        for(int i=0;i<10000;i++) total++;
        mtx.unlock();
}

int main()
{
        print_thread_id(1);
        print_thread_id(2);
        std::cout<<"total="<<total<<std::endl;
        return 0;
}

我没起线程啊,只想看看std::mutex是怎么lock的, 这里调用print_thread_id两次也是故意的,因为第一次很多函数符号都没解决(函数@plt),遇到一个函数都要到ld里走一圈,很烦人。而第二次调用就用不着了。

在第二个print_thread_id上加断点,gdb中layout asm看汇编(也可以直接看glibc源码,实际源码有太多宏更不如汇编看的直接):

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

一路si(单步instruction执行),来到了关键指令:lock cmpxchg

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg $r8正好执行我们定义的全局变量mtx, 从上个截图可以看到mtx结构中第一个member是int类型的__lock(看到名字也能盲猜这是mutex::lock的关键),而edi=1。

cmpxchg指令语法如下(请把cmos_lock看成mtx.__lock,  %edx为1):

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

 cmpxchg会原子的完成下面的IF+赋值,不会让别的线程看到中间状态。

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

 没被锁的情况下,destination(mtx.__lock)为0,accumulator($EAX)为0(pthread_mutex_lock+91 xor %eax,%eax使得eax的值为0),故ZF标志位被置为1,同时把source(1,pthread_mutex_lock+86 mov 1,%edi)存入mtx.__lock(表示锁上了)。

被别人锁的情况,请看下面的调试:

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

至于mtx.__lock会不会被各个CPU缓存,或者此指令后面的指令会不会被CPU重排,查了一些资料,也没弄100%明白,姑且先认为是吧。不然这么底层的东西早就造成大量问题了。

附上一些讨论:

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

concurrency - Is x86 CMPXCHG atomic, if so why does it need LOCK? - Stack Overflowhttps://stackoverflow.com/questions/27837731/is-x86-cmpxchg-atomic-if-so-why-does-it-need-lock

multithreading - Do locked instructions provide a barrier between weakly-ordered accesses? - Stack Overflowhttps://stackoverflow.com/questions/50280857/do-locked-instructions-provide-a-barrier-between-weakly-ordered-accesses
https://heather.cs.ucdavis.edu/matloff/public_html/50/PLN/lock.pdfhttps://heather.cs.ucdavis.edu/matloff/public_html/50/PLN/lock.pdf

 如果此处发现mtx.__lock已经是1,也就是别人锁上了,则转系统调用202号(sys_futex)挂起当前线程。

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

Modern C++ std::mutex底层原理,modern C++,c++,mutex,cmpxchg

 文章来源地址https://www.toymoban.com/news/detail-797994.html

到了这里,关于Modern C++ std::mutex底层原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Effective Modern C++ 第七章 并发API 1

    目录 条款35:优先使用基于任务而非基于线程的程序设计 要点速记:  条款36:如果异步是必要的,则指定std::launch::async 要点速记: 参考:EffectiveModernCppChinese/src/7.TheConcurrencyAPI/Item35.md at master · CnTransGroup/EffectiveModernCppChinese (github.com) 基于任务的方法通常比基于线程的方法更

    2024年02月07日
    浏览(24)
  • Introduction to modern Cryptography 现代密码学原理与协议第二章笔记

    M表示明文空间,K表示密钥空间,C表示所有可能的密文集合 完善保密加密 的概念: 简化约定,不再特殊声明 ,除数为0无意义 完全保密加密的等价公式: 证明: 必要性证明略,此证明为条件概率的简单应用 完全不可区分性 : 完善保密加密的另一形式:  证明:   敌手不可区分性

    2024年02月03日
    浏览(30)
  • USACO21FEB Modern Art 3 G

    P7414 [USACO21FEB] Modern Art 3 G 题目大意 给你一个长度为 n n n 的数组,要求你在一个全部为 0 0 0 的数组中每次将一个区间 [ i , j ] [i,j] [ i , j ] 赋为同一个值,当前的赋值可以覆盖之前的值,求最少要赋值多少次才能使这个数组与给定数组相同。 1 ≤ n ≤ 300 1leq nleq 300 1 ≤ n ≤

    2024年02月09日
    浏览(27)
  • Develop Modern WinForms Applications Using .NET 8

    Bunifu UI WinForms v7.0 streamlines professional WinForms UI development with the addition of Microsoft .NET 8 support. Bunifu UI WinForms is a user interface (UI) framework designed to streamline the development of modern and visually appealing desktop applications using Microsoft\\\'s WinForms platform. It provides a wide array of pre-built, customizable UI c

    2024年04月27日
    浏览(30)
  • 【现代密码学】笔记6--伪随机对象的理论构造《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月16日
    浏览(30)
  • 【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月17日
    浏览(35)
  • 【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月18日
    浏览(37)
  • 【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 B站视频 密码学原理《Introduction to modern Cryptog

    2024年01月20日
    浏览(34)
  • 【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月24日
    浏览(35)
  • 论文精读:《BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective 》

    本文工作: 提出了一种具有透视监督(perspective supervision)的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像骨干。 现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连,阻碍了蓬勃发展的图像主干和BEV检测器之间的协同作用。 为了解决这一限制

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包