繁体   English   中英

C ++ 11 cmake O3选项<no matching constructor for initialization of 'std::thread'>

[英]C++11 cmake O3 option <no matching constructor for initialization of 'std::thread'>

我将C ++与CMake makefile一起使用-std=c++11

我的程序使用几种线程方法。 我可以毫无问题地构建和执行程序。

但是,当我在CMake选项上添加-03优化标志时,我-03此错误消息:

“没有匹配的构造函数,无法初始化'std :: thread'”

首先,我不理解为什么仅在-O3选项中出现。

其次,我想在-O3进行编译,我看到其他人在Q&A上谈论mythread = std::thread(&X::run<A, B>, this, a, b); 但它在我的程序中不起作用,我也不知道如何使用。

在这里,我要介绍的功能:

static void getPoints(Mat *in, vector<Point> *posPoint, float *h,int rad, int dex,int decy, Mat *debug = NULL );

今天我用以下方法非常简单地调用: std::thread t1(get4points,&myImage, ...

如果是std::thread(&X::run<A, B>, this, a, b); 我不明白&X::run<A, B>到底是什么,如果我在同一类的函数中调用一个类的函数。

伪代码示例:

class myclass
{
    template<int A, int B> void run(int a, int b)
    {
        // ...
    }

    void myMainfunction(int a, int b)
    {
        ?????? -> std::thread(&this::run<int, int>, this, 1, 1);
    }
};

从代码示例中,您必须定义所有模板参数,以指定要在线程构造函数中传递的具体函数。

因此,如果您有:

class myclass
{
   template<int A, int B> void run(int a, int b)
    {
    }
};

您必须为A&B指定参数,例如:

auto x = std::thread(&myclass::run<55, 66>, this, 1, 1);

如果您的方法是static ,则根本没有相关的对象,因此将对象指针传递给线程构造函数没有任何意义。 您只需写:

class myclass
{
    template<int A, int B> static void run(int a, int b)
    {
    }
};


auto x = std::thread(&myclass::run<77, 88>, 1, 1);

你问:

如果是std :: thread(&X :: run,this,a,b); 如果我在同一类的函数中调用一个类的函数,我不明白&X :: run到底是什么。

您不了解类和对象的区别! this指向您班级的对象,而不是班级本身。 在尝试使用模板之前,请先阅读有关C ++的基础知识。 如果是static函数,则没有已提到的对象。

为了了解是否使用this指针,该对象和对非静态函数的调用在以下示例中进行了介绍:

class myclass
{   
    private:
        int ia; 

    public:
        myclass( int _ia): ia{_ia}{}

        template<int A, int B> static void staticFun(int a, int b)
        {   
            std::cout << "Val of A: " << A << " Val of B: " << B << " a: " << a << " b: " << b << std::endl;
        }   

        template<int A, int B> void Fun(int a, int b)
        {   
            std::cout << "Val of A: " << A << " Val of B: " << B << " a: " << a << " b: " << b << " ia of instance: " << ia << std::endl;
        }   
};  

int main() 
{   
    myclass mc1(1);
    myclass mc2(2);

    auto x = std::thread(&myclass::staticFun<55, 66>, 1, 2); 
    auto y = std::thread(&myclass::Fun<77,88>, &mc1, 3, 4); 
    auto z = std::thread(&myclass::Fun<78,89>, &mc2, 5, 6); 


    x.join();
    y.join();
    z.join();
}

输出将是这样的:

A值:55 B值:66 a:1 b:2

A值:77 B值:88 a:3 b:4实例:1

A值:78 B值:89 a:5 b:6实例:2

但是请记住,调用std :: cout的运算符<<完全不会同步。 因此,每个线程可以随时将其写入流中,结果将被破坏或以任何顺序出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM