gpt4 book ai didi

c++ - 事件对象 - 从函数对象类创建线程

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:43 25 4
gpt4 key购买 nike

我想创建在实例化时启动新线程(执行它们的函数应用程序运算符)的事件对象。

template <typename R, typename... Ts> // VARIADIC TEMPLATE
class active_object{
protected:
std::thread* t;
R& result;

public:
active_object(R init, Ts... args) : t{nullptr}, result{init} {
start_thread(args...);
}

void start_thread(Ts... args){
t = new std::thread( *this, args...);
}

~active_object(){
if(t->joinable())
t->join();
delete t;
}

void set_result(R& result_){
result = result_;
}

// pure virtual function => makes this class abstract
virtual void operator()(Ts... args) = 0;

};

然后:

class myactiveobject : public active_object<double,int,int,bool> {
public:
myactiveobject(double init, int i1, int i2, bool b) : active_object{init, i1, i2, b} {}

void operator()(int x, int y, bool which){
double result = 0.1;
if(which)
result *= x;
else
result *= y;

set_result(result);
}
};

现在,我得到这个错误:

$ g++ -std=c++11 -pthread main.cpp
In file included from /usr/include/c++/4.7/functional:56:0,
from /usr/include/c++/4.7/thread:39,
from multithreading.h:2,
from main.cpp:1:
/usr/include/c++/4.7/tuple: In instantiation of ‘struct std::_Head_base<0u, roby::multithreading::active_object<double, int, int, bool>, false>’:
/usr/include/c++/4.7/tuple:215:12: required from ‘struct std::_Tuple_impl<0u, roby::multithreading::active_object<double, int, int, bool>, int, int, bool>’
/usr/include/c++/4.7/tuple:374:11: required from ‘class std::tuple<roby::multithreading::active_object<double, int, int, bool>, int, int, bool>’
/usr/include/c++/4.7/functional:1601:39: required from ‘struct std::_Bind_simple<roby::multithreading::active_object<double, int, int, bool>(int, int, bool)>’
/usr/include/c++/4.7/thread:133:9: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = roby::multithreading::active_object<double, int, int, bool>&; _Args = {int&, int&, bool&}]’
multithreading.h:36:5: required from ‘void roby::multithreading::active_object<R, Ts>::start_thread(Ts ...) [with R = double; Ts = {int, int, bool}]’
multithreading.h:31:5: required from ‘roby::multithreading::active_object<R, Ts>::active_object(R, Ts ...) [with R = double; Ts = {int, int, bool}]’
main.cpp:11:85: required from here
/usr/include/c++/4.7/tuple:166:13: error: cannot declare field ‘std::_Head_base<0u, roby::multithreading::active_object<double, int, int, bool>, false>::_M_head_impl’ to be of abstract type ‘roby::multithreading::active_object<double, int, int, bool>’
In file included from main.cpp:1:0:
multithreading.h:23:9: note: because the following virtual functions are pure within ‘roby::multithreading::active_object<double, int, int, bool>’:
multithreading.h:51:17: note: void roby::multithreading::active_object<R, Ts>::operator()(Ts ...) [with R = double; Ts = {int, int, bool}]

虽然在我将 active_object 上的 operator() 设为非纯虚函数的情况下,它编译但在 std::thread() 构造上给我一个段错误。

最佳答案

std::thread( *this, args...) 复制了 *this。好吧,尝试。它不能这样做,因为 active_object 是一个抽象类(如果可能的话,情况会更糟,因为 active_object 违反了三的规则)。

你需要使用 std::thread(std::ref(*this), args...) 所以 std::thread 对象存储一个引用,不是拷贝。

关于c++ - 事件对象 - 从函数对象类创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com