• C++并发与多线程学习笔记--atomic


    • std::atomic
    • std::async

    std::atomic

    一般atomic原子操作,针对++,--,+=,^=是支持的,其他结果可能不支持。

    注意

    std::atomic<int> g_varibale = 0;
    
    ....
    int f(){
        g_varibale = g_varibale +1; //这样的写法有问题
    }
    

      很多时候,写程序简单就是美,不太建议把程序写得复杂。多线程程序要求稳定,然后在稳定的基础上去扩展功能。

    std::async参数详解

    async是用来创建一个异步任务,比如

    int mythread()
    {
        cout << "This thread "<<std::this_thread::get_id()<<endl;
        return 1;
    }
    

      在main中:

    std::future<int> result = std::async(mythread);
    cout << result.get()<<endl;
    

      程序的执行结果为1)启动一个线程 2)最终线程返回1。

    延迟调用的参数:std::launch::deferred,以及std::launch::async 这个参数是强制创建一个线程。

    std::thread是用来创建一个线程的,如果创建线程过多,系统资源紧张,那么创建线程就会失败,那么程序就会失败,那么执行std::thread时程序可能崩溃。

    std::async一般不叫它创建线程,一般是创建一个异步任务,有时候并不创建新的线程。

    a) 如果用std::launch::deferred来调用async,用了deferred之后是延迟调用,并且不创建新线程,延迟到future对象调用get或者wait的时候才执行函数。

    b) std::launch::async,强制异步任务在新线程上执行,这意味着系统必须要创建出新线程来执行函数。

    c) 如果同时用到deferred和async,即std::launch::async | std::launch::deferred,此时"或":意味着调用async的行为可能是创建新线程并立即执行,或者是没有创建新线程,并且延迟调用,直到get时候才开始执行任务,两者居其一。系统会根据一定的因素,自动分配。此时有不确定性,那么写程序的时候就要注意是否创建新线程来运行。

    d) 如果不带而外参数,只给async函数一个入口函数名。当没有指定async和deferred,默认值是c)中两者都有的效果完全一致,系统会自行决定是同步还是异步执行。如果是异步,那么创建新线程,而如果是同步,那么不创建新线程。

    e)系统如何决定是异步还是同步?

    std::thread是一定会创建线程,a)如果系统资源紧张,那么程序会报异常,然后程序退出。 b)用thread创建线程,往往会复制变量到线程中,如果要拿到返回值,需要一个全局量或者其他方式。std::async和std::thead不同,async是创建一个异步任务,可能创建线程,也可能不创建线程,并且async调用方法,很容易得到线程的返回值,这个是async的优势。由于系统资源限制,

    (1)如果用std::thread创建的线程太多,创建失败时,系统崩溃。

    (2)如果用async就不会报异常,如果系统资源紧张,导致无法创建新的线程,这种不加额外参数的调用,就不会创建新线程,而是后续谁调用了get,这个异步任务就运行在执行这条get的语句所在的线程上。

    (3)一个程序里,线程数量不应超过100-200。

    std::async不确定性的解决

    不加额外参数的std::async,让系统自行决定是否创建新线程,存在不确定性,写程序的时候就会出现问题。

    问题的焦点在于std::future<int> result = std::async(mythread)这个异步任务是否被推迟执行,std::future对象的wait_for 函数

  • 相关阅读:
    【C语言】用"I love you!"打印心形
    android js与控件交互初探。
    android 调用webview控件,为逆向h5app做准备
    git命令
    kdevelp 导入makefile工程
    解决vmvare关闭过慢
    用python.twisted.logfile每天记录日志,并用不记录stdout中的内容
    关于bjam编译自己模块出错的问题
    俄罗斯黑客在美国监狱中获刑4年,到底是什么原因?
    美国的电信巨头T-Mobile今天披露了另一起数据遭黑客泄露事件
  • 原文地址:https://www.cnblogs.com/rynerlute/p/11930233.html
Copyright © 2020-2023  润新知