我很难获得在单独的线程中调用类成员函数的正确语法。这三个选项都没有起作用。第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;
}
答案 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();