并发多线程4创建多个线程、数据共享问题分析

第四节 创建多个线程、数据共享问题分析、案例代码

一、创建和等待多个线程

#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大佬

    并发多线程4创建多个线程、数据共享问题分析

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404299

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:27
下一篇 2023年4月25日 下午4:27

相关推荐