不能在其他 class 中执行异步 运行 成员函数
Can't do async run member function in other class
我尝试异步到其他 class 中的成员函数,但不能。
这是我的代码中的概述
#include <iostream>
#include <thread>
#include <future>
#include <vector>
using namespace std;
class Work
{
public:
void doWork(int A);
};
void Work::doWork(int A)
{
cout<<"I got "<<A<<endl;
}
class Worker
{
private:
vector<int> work_list;
Work* workset = NULL;
public:
void Work_MP();
};
void Worker::Work_MP()
{
vector<std::future<void>> v_async;
v_async.reserve(8);
for (size_t i = 0; i < 8; i++)
{
Work* workset = new Work();
v_async.emplace_back(std::async(std::launch::async, &Work::doWork, &workset, i));
}
}
int main ()
{
}
不过,我给出了其他 class 函数和实例的指针。没用。
是否缺少其他需要的声明?
我试图修复您的代码并提出了一个可以正常工作的版本。你那里有很多不必要的混乱。您的代码也会泄漏工作集指针。正如评论中指出的那样,主要错误是 &workset
它创建了一个“指向指针的引用”,您需要的只是指针本身。您应该完全避免普通指针。这是我想出的,希望对您有所帮助:
#include <vector>
#include <future>
#include <iostream>
class Work
{
public:
void doWork(int A){
std::cout << "I got " << A << std::endl;
}
};
class Worker
{
public:
void Work_MP(){
std::vector< std::future<void> > v_async;
v_async.reserve( 8 );
for( size_t i = 0; i < 8; ++i ){
std::shared_ptr<Work> workset = std::make_shared<Work>();
v_async.emplace_back( std::async( std::launch::async, &Work::doWork, workset, i ) );
}
}
};
int main ()
{
Worker worker;
worker.Work_MP();
return 0;
}
如您所见,为了简洁起见,我内联了函数定义。将普通指针转换为共享指针并删除未使用的变量。
在此处查看实际效果:https://onlinegdb.com/vFQo8R1rA
我尝试异步到其他 class 中的成员函数,但不能。 这是我的代码中的概述
#include <iostream>
#include <thread>
#include <future>
#include <vector>
using namespace std;
class Work
{
public:
void doWork(int A);
};
void Work::doWork(int A)
{
cout<<"I got "<<A<<endl;
}
class Worker
{
private:
vector<int> work_list;
Work* workset = NULL;
public:
void Work_MP();
};
void Worker::Work_MP()
{
vector<std::future<void>> v_async;
v_async.reserve(8);
for (size_t i = 0; i < 8; i++)
{
Work* workset = new Work();
v_async.emplace_back(std::async(std::launch::async, &Work::doWork, &workset, i));
}
}
int main ()
{
}
不过,我给出了其他 class 函数和实例的指针。没用。 是否缺少其他需要的声明?
我试图修复您的代码并提出了一个可以正常工作的版本。你那里有很多不必要的混乱。您的代码也会泄漏工作集指针。正如评论中指出的那样,主要错误是 &workset
它创建了一个“指向指针的引用”,您需要的只是指针本身。您应该完全避免普通指针。这是我想出的,希望对您有所帮助:
#include <vector>
#include <future>
#include <iostream>
class Work
{
public:
void doWork(int A){
std::cout << "I got " << A << std::endl;
}
};
class Worker
{
public:
void Work_MP(){
std::vector< std::future<void> > v_async;
v_async.reserve( 8 );
for( size_t i = 0; i < 8; ++i ){
std::shared_ptr<Work> workset = std::make_shared<Work>();
v_async.emplace_back( std::async( std::launch::async, &Work::doWork, workset, i ) );
}
}
};
int main ()
{
Worker worker;
worker.Work_MP();
return 0;
}
如您所见,为了简洁起见,我内联了函数定义。将普通指针转换为共享指针并删除未使用的变量。
在此处查看实际效果:https://onlinegdb.com/vFQo8R1rA