第四节 创建多个线程、数据共享问题分析、案例代码
一、创建和等待多个线程
#include <thread> #include <iostream> #include <vector> using namespace std; void TextThread() { cout << "我是线程" << this_thread::get_id() << endl; /* … */ cout << "线程" << this_thread::get_id() << "执行结束" << endl; } int main() { vector<thread> threadagg; for (int i = 0; i < 10; ++i) { threadagg.push_back(thread(TextThread)); } for (int i = 0; i < 10; ++i) { threadagg[i].join(); } }
把thread对象放入到容器中管理,看起来像个thread对象数组,对一次创建大量的线程并对大量线程进行管理有好处
多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关
二:数据共享问题分析
2.1 只读的数据
是安全稳定的
2.2 有读有写
若不加处理,就会出错
最简单的防止崩溃方法:读的时候不能写,写的时候不能读。
写的动作分10小步,由于任务切换,导致各种诡异的事情发生(最可能的还是崩溃)
解决方式:
原子类型操作
一个选择是对数据结构和不变量的设计进行修改,修改完的结构必须能完成一系列不可分割的变化,也就是保证每个不变量保持稳定的状态,这就是所谓的无锁编程。不过,这种方式很难得到正确的结果。如果到这个级别,无论是内存模型上的细微差异,还是线程访问数据的能力,都会让工作变的复杂。
事务操作
另一种处理条件竞争的方式是,使用事务的方式去处理数据结构的更新(这里的”处理”就如同对数据库进行更新一样)。所需的一些数据和读取都存储在事务日志中,然后将之前的操作合为一步,再进行提交。当数据结构被另一个线程修改后,或处理已经重启的情况下,提交就会无法进行,这称作为“软件事务内存”。
互斥量
保护共享数据结构的最基本的方式,是使用C++标准库提供的互斥量。
原文链接:https://blog.csdn.net/qq_38231713/article/details/106091759
原文链接: https://www.cnblogs.com/gk520/p/16640806.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404299
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!