callable类型和多线程启动

callable类型和多线程启动

  1. 返回值void,不接受参数的函数
    void hello() {
    
    }
    std::thread t(hello); // 启动线程
    
  2. 类的实例,这个类支持void operator ()();
    class background_task{
        public:
            void operator ()() {
                do_something();
            }
    };
    background_task f;
    std::thread my_thread(f); // 启动线程
    // 错误示例1
    std::thread my_thread(background_task());
    // 错因
    // 尝试传递一个临时的未命名的background_task类型的变量,企图构造一个线程并启动
    // 然而,这个会被编译器解释为一个函数声明。
    // 具体来说,
    // 就是一个返回类型为std::thread
    // 函数名为my_thread
    // 函数的参数类型是指向不接受参数同时返回background_task类型对象的函数的指针
    // 换句话说是
    // 函数的参数类型是一个函数指针,什么样的函数指针呢?这个函数指针是指向不接受参数同时返回background_task类型对象的函数
    // 这个错误的确非常的隐蔽,不得不说真的强……
    // 
    // 如何正确的实现这个意图呢?
    std::thread my_thread( (background_task()) ); // 方法1 加一对小括号
    std::thread my_thread{background_task()}; // 方法2 改用新的统一初始化方法——使用大括号
    

本文里面的代码大多来自于《C++并发变成实践》中的例子代码,版权不属于我。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容