• C++并发编程实战---阅读笔记


    1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”。如果传递了一个临时变量,而不是一个命名的变量;C++编译器会将其解析为函数声明,而不是类型对象的定义。

    例如:

    class background_task
    {
    public:
    void operator()() const
    {
    do_something();
    do_something_else();
    }
    };
    background_task f;
    std::thread my_thread(f);//正确
    
    std::thread my_thread(background_task());//???my_thread变成了一个函数

    ???这里相当与声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参
    数并返回background_task对象的函数),返回一个 std::thread 对象的函数,而非启动了一个
    线程。

    使用在前面命名函数对象的方式,或使用多组括号①,或使用新统一的初始化语法②,可以避
    免这个问题。
    如下所示:

    std::thread my_thread((background_task())); // 1
    std::thread my_thread{background_task()}; // 2

    使用lambda表达式也能避免这个问题。

    std::thread my_thread([]{
    do_something();
    do_something_else();
    });

    2. 精心组织代码来保护共享数据

    切勿将受保护数据的指针或引用传递到互斥锁作用域之外,无论
    是函数返回值,还是存储在外部可见内存,亦或是以参数的形式传递到用户提供的函数中
    去。

  • 相关阅读:
    JS输入框正则校验
    JVM 参数查看与设置
    Java 设计模式汇总
    Android Notification
    Android PendingIntent
    Android AsyncTask详解
    Java Stake实现
    Camera2相机预览流程
    java annotation
    Java io包 FileInputStream&FileOutStream
  • 原文地址:https://www.cnblogs.com/zhanghu52030/p/9322958.html
Copyright © 2020-2023  润新知