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++并发变成实践》中的例子代码,版权不属于我。

你可能感兴趣的:(callable类型和多线程启动)