gpt4 book ai didi

c++ - std::thread,在 `this' 上启动线程(从类本身内部)

转载 作者:太空狗 更新时间:2023-10-29 20:06:10 25 4
gpt4 key购买 nike

我正在尝试创建一个类,该类启动其成员方法之一的线程实例。当我在 main 中执行时:

test myinstance;
std::thread mythread(myinstance);

然后编译。但是使用以下结构:

#include <stdio.h>
#include <unistd.h>
#include <thread>

class test
{
std::thread *pt;
public:
test()
{
pt = new std::thread(this);
}

void operator()() const
{
printf("thread start\n");
sleep(5);
printf("thread end\n");
}
};

int main(int arg, char *argv[])
{
test ptest;
sleep(10);

return 0;
}

我收到以下错误:

folkert@here:~$ g++ -std=c++0x test.cpp In file included from /usr/include/c++/4.6/thread:39:0, from test.cpp:3: /usr/include/c++/4.6/functional: In member function 'void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [with _Res = void, _Args = {}, int ..._Indexes = {}, _Result = void, _Functor = test*, _Bound_args = {}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]': /usr/include/c++/4.6/functional:1378:24: instantiated from 'std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {}, _Result = void, _Functor = test*, _Bound_args = {}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]' /usr/include/c++/4.6/thread:117:13: instantiated from 'void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind_result]' test.cpp:28:1: instantiated from here /usr/include/c++/4.6/functional:1287:4: error: '((std::_Bind_result*)this)->std::_Bind_result::_M_f' cannot be used as a function

所以我的猜测是它不会以这种方式工作。我现在的问题是:如何使用 std::thread 让一个类启动它自己的方法之一的线程?

最佳答案

std::thread 的构造函数之一如下所示:

template<typename Callable>
explicit thread(Callable func);

这要求您传递一些可调用 的东西,这意味着它可以用operator() 调用。您传递给 std::thread 的内容不可调用。

你不能调用thisthis 是指向当前对象的指针,它是不可调用的。

您需要将成员函数或其他函数传递到您的 std::thread 构造函数中。

您还可以创建一个仿函数并传递它,因为它是可调用的。

编辑:刚刚注意到确实重载了 operator(),要调用它,您需要执行以下操作:

  test t;
std::thread my_thread(t); //invokes operator() on test.

//also remove this statement from your ctor: pt = new std::thread(this);

关于c++ - std::thread,在 `this' 上启动线程(从类本身内部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9189989/

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