![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++ std::thread
文章平均质量分 78
Hello:CodeWorld
走过大半个中国去睡你、
展开
-
局部变量是线程安全的,原因是什么?
局部变量的线程安全性原因是因为每个线程都有自己独立的线程栈空间,不同线程之间不会共享局部变量。需要注意多线程同时访问同一个引用类型的局部变量时可能出现的线程竞争问题,需要加锁保证线程安全。作者:Lion Long链接:https://www.zhihu.com/question/601406551/answer/3033562577来源:知乎。转载 2024-06-02 09:29:54 · 53 阅读 · 1 评论 -
为什么局部变量是线程安全的?
例如,在Java 5.0之前,Integer.toString()方法使用ThreadLocal对象来保存一个12字节大小的缓冲区,用于对结果进行格式化,而不是使用共享的静态缓冲区(需要使用加锁机制)或者每次调用时都分配一个新的缓冲区。当调用fibonacci(a)时,CPU要先找到方法fibonacci()的地址(在CPU堆栈寄存器中),然后跳转到这个地址去执行代码(蓝色线),最后CPU执行完方法,再返回原来调用方法的下一条语句(红色线)。即,栈帧和方法同生共死。方法A中调用方法B,方法B中调用方法C。转载 2024-04-30 16:48:40 · 16 阅读 · 0 评论 -
C++线程安全容器stack和queue的使用详细介绍
线程安全容器是可以支持在多个线程并发访问的STL容器。在多线程程序中使用线程安全容器可以保证数据操作的正确性和安全性。转载 2023-12-17 14:55:22 · 721 阅读 · 0 评论 -
C++多线程编程<一>之常见面试问题
3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。线程的基本状态包括:新线程态、可运行态、阻塞 / 非运行态、死亡态。当访问资源量存在先后的顺序的时候使用同步,当需要独占试访问资源时使用互斥。第一题:线程的基本概念、线程的基本状态及状态之间的关系?第四题:多线程同步和互斥有几种实现方法,都是什么?转载 2023-12-16 21:00:06 · 1003 阅读 · 0 评论 -
C++11多线程编程(互斥量和条件变量)
那么就会判断flag是否等于x,很显然如果是主线程先拿到锁此时flag=10,x=100不等,那么这个时候主线程就会执行wait(),也就是会被阻塞,然后因为wait()自身有这样一个机制(当他执行的时候会自动释放锁吗,也就是会自动执行unlock,给其他线程一个拿锁的机会),这个时候子线程就会拿到锁,并且判断fag是否等于x,这时候明显是相等的,那么就会进行下面的一系列循环,这个时候重点来了,一定要改变全局变量!2、然后问题来了,怎么控制子线程循环后主线程循环,然后一直这样依次循环呢?转载 2023-12-16 20:47:31 · 18 阅读 · 0 评论 -
C/C++ 多线程编程
用户线程和内核线程的映射是M:1或者M:N的关系,而内核线程和硬件线程也存在映射关系,且内核或者说操作系统并不知道用户线程的存在,操作系统只知道内核线程的存在,关于用户线程向内核线程的调度是通过线程库去实现的,内核线程向硬件线程的调度是通过操作系统实现的,因为不管是用户线程映射到内核线程还是内核线程映射到硬件线程都不是1:1的关系,所以会存在 用户线程的上下文切换和内核线程的上下文切换,切换的对比上面已经说了。因为他是用到了超线程技术,我们知道CPU执行执行分为五个步骤,分别是。转载 2023-06-14 15:37:02 · 211 阅读 · 0 评论 -
std::lock_guard(轻锁)std::unique_lock(重锁)区别
lock_guard 是基于互斥锁 std::mutex 实现的,unique_lock 是基于通用锁 std::unique_lock 实现的,unique_lock 可以实现比 lock_guard 更灵活的锁操作。它的使用方法很简单,只需要在代码中创建一个 std::lock_guard 对象,并传入一个互斥锁,在它的生命周期内,互斥锁的访问权限将被控制。当使用{}括起来的代码块创建std::lock_guard对象时,std::lock_guard的生命周期将仅限于该代码块内部。转载 2023-06-14 15:22:08 · 3444 阅读 · 0 评论 -
C++ std::thread使用
由于std::thread创建后默认是joinable的, 所以需要调用join()或者detach() 来使线程变成非joinable的状态, 具体使用join()还是detach() 取决于实际需求, 如果需要等待线程完成才能继续,那就使用join()来等待, 如果需要立刻返回继续其他操作, 那就调用detach()来脱离对线程的管理, 两者必须选一个。另外,如果某个线程 已经执行完任务,但是没有被 join 的话,该线程依然会被认为是一个活动的执行线程,因此也是可以被 join 的。转载 2023-06-14 15:05:28 · 993 阅读 · 0 评论 -
C++ std::thread 多线编程
C++ std::thread原创 2023-06-14 14:38:28 · 107 阅读 · 0 评论