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

时间:2017-10-23 08:26:25

标签: c++ multithreading c++11

我使用带有-std=c++11的CMake makefile的C ++。

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

但是当我在CMake选项上添加-03优化标志时,我收到以下错误信息:

  

&#34;没有匹配的构造函数用于初始化&#39; std :: thread&#39;&#34;

首先我要了解为什么只出现在-O3选项中。

其次我想在-O3中编译,我看到其他人问与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);
    }
};

1 个答案:

答案 0 :(得分:2)

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

所以如果你有:

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

您必须指定A&amp;的参数。 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(&amp; X :: run,this,a,b);如果我在同一个类的函数中调用一个类的函数,我就不明白究竟是什么&amp; 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的Val:B的Val:66 a:1 b:2

     

A的Val:B的Val:88 a:3 b:实例的4 ia:1

     

A的Val:B的Val:89 a:5 b:实例的6 ia:2

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