无法使用C ++ 11线程类在单独的线程中调用类成员函数

时间:2016-04-24 21:44:51

标签: c++ multithreading class c++11 member-functions

我很难获得在单独的线程中调用类成员函数的正确语法。这三个选项都没有起作用。第1行和第2行抛出编译时错误,而第3行显示运行时错误。请有人告诉我,正确的方法是什么。

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
struct Complex 
{
    mutex mx;
    int i;
    Complex(int q) : i(q) {}
    void mul(int x) 
    {
        lock_guard<mutex> lock(mx);
        int z = i*x;
        cout<<z<<endl;
    }
    void div(int x)
    {
        lock_guard<mutex> lock(mx);
        int z = i/x;
        cout<<z<<endl;
    }
    void both(int x, int y) 
    {
         mul(x);
         div(y);
    }
};
int main()
{
    //Complex complex(9);
    //thread t(&Complex::both,&Complex(9),32, 23);     --1
    //thread t(&Complex::both,complex,32,23);          --2
    //thread t(&Complex::both,&complex,32,23);         --3
    return 0;
}

1 个答案:

答案 0 :(得分:4)

(1)不起作用,因为表达式&Complex(9)格式不正确 - 你试图取一个临时的地址而不允许这样做。

(2)不起作用,因为std::thread将在内部复制所有参数。 complex的复制构造函数被定义为已删除,因为它包含std::mutex类型的成员,其copy constructor已被删除。

(3)编译正常但在运行时会失败,因为创建的线程t在加入之前将被销毁。您首先需要join

std::thread t(&Complex::both, &complex, 32, 32);
t.join();