std::thread,在“this”上启动线程(从类本身内部)

2024-01-14

我正在尝试创建一个类,该类启动其成员方法之一的线程实例。 当我在 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 在包含的文件中 /usr/include/c++/4.6/thread:39:0, 来自 test.cpp:3: /usr/include/c++/4.6/function: 在成员函数 'void std::_Bind_result<_result _functor ...>::__call(std::tuple<_args ...>&&, std::_Index_tuple<_indexes ...>,类型名 std::_Bind_result<_result _functor ...>::__enable_if_void<_res>::type) [其中 _Res = void, _Args = {}, int ..._Indexes = {},_Result = void,_Functor = test*,_Bound_args = {},类型名 std::_Bind_result<_result _functor ...>::__enable_if_void<_res>::type = int]': /usr/include/c++/4.6/function:1378:24:实例化自 'std::_Bind_result<_result _functor ...>::result_type std::_Bind_result<_result _functor ...>::operator()(_Args&& ...) [其中 _Args = {}, _Result = void, _Functor = test*, _Bound_args = {}, std::_Bind_result<_result _functor ...>::result_type = void]' /usr/include/c++/4.6/thread:117:13: 从 ' 实例化空白 std::thread::_Impl<_callable>::_M_run() [with _Callable = std::_Bind_result]' test.cpp:28:1:实例化自 这里 /usr/include/c++/4.6/functioning:1287:4: 错误: '((std::_Bind_result*)this)->std::_Bind_result::_M_f' 不能用作函数

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


One of std::threads 构造函数如下所示:

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

这需要你传递一些东西callable,这意味着它可以被调用operator()。你要传递给你的std::thread不可调用。

你不能打电话this. this是指向当前对象的指针,它不可调用。

您需要将成员函数或其他函数传递到您的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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::thread,在“this”上启动线程(从类本身内部) 的相关文章

随机推荐

  • 引用硬币 Firebase 数据库将硬币倍增,直到应用程序崩溃

    我在我的应用程序中添加了推荐硬币系统 如果您将其推荐给某人 您将获得 100 个硬币 并且您使用的推荐代码是相同的 但问题是 当我运行应用程序并使用推荐代码硬币时 除非应用程序崩溃 否则推荐代码硬币会不断增加 两个帐户中的金币都应添加 10
  • 如何将 Content-Length、Content-Type 和 Last-Modified 添加到 HTTP 响应消息标头

    如何使用 net 将 Content Length Content Type 和 Last Modified 添加到 HttpResponseMessage 标头 添加这些字段后 我需要将所有这些值手动附加到响应中 我需要从服务器返回响应
  • 向jetty添加多个资源目录

    希望在 Jetty 中使用多个静态目录 当服务器运行时 http localhost 8282 A http localhost 8282 B http localhost 8282 C A 置于 X V A 中 B 置于 Q Z B 中
  • Cloud Run 是否需要 NGINX?

    我正在为我的博客和工作网站使用 Cloud Run 我真的很喜欢它 我已经根据 google 教程通过容器化部署了 python API 和 Vue Nuxt 应用程序 我不明白的一件事是为什么前面不需要 NGINX Use the off
  • 如何在Python中打印一个数字n次? [复制]

    这个问题在这里已经有答案了 如何在Python中打印一个数字n次 我可以像这样打印 A 5 次 print A 5 AAAAA 但不是 10 个 像这样 print 10 5 50 我想要的答案是10 10 10 10 10 我如何逃避数学
  • 将文件附加到存档而不读取/重写整个存档

    我有很多文件想要存储在一个存档文件中 我的第一个方法是将文件存储在压缩的 tarball 中 问题是 如果添加单个文件 我必须重写整个存档 我可以摆脱 gzip 压缩 但添加文件仍然很昂贵 您建议使用哪种其他存档格式来允许快速追加操作 Th
  • Laravel 迁移 - 创建时间戳时出现问题

    我正在尝试在我的 Laravel 实例上运行迁移 它们只是默认迁移 用户和密码重置 但是当它尝试创建时间戳时 它会抛出此错误 Illuminate Database QueryException SQLSTATE 42000 Syntax
  • 正则表达式中的可选字符

    任务非常简单 但我还没有想出一个好的解决方案 字符串可以包含数字 破折号和加号 或者仅包含数字 0 9 做了我需要的大部分工作 除了当用户输入像 这样的垃圾时 我在常规前瞻方面运气不佳 因为破折号和加号可能位于字符串中的任何位置 有效字符串
  • 来自 QDataStream 的 QT QString

    我正在使用缓冲区 并试图从中获取字符串 但不起作用 Example void myFunc QDataStream in quint8 v in gt gt v Ok I caught v value successfuly QString
  • 如何通过 grunt-contrib-uglify 按顺序缩小 js 文件?

    我有一个如下所示的目录 文件夹 b js 文件夹 jQuery js 文件夹 a js 文件夹 sub c js 我想将所有这些js文件缩小到一个js文件中in order jQuery js gt a js gt b js gt c js
  • VBA 多个循环匹配条件

    如果这是重复的 我深表歉意 因为我一直在搜索但没有找到答案 我对 VBA 以及它们如何构造循环很陌生 我正在尝试进行搜索和比较 我需要比较第一行中的值 看看它们是否与第二行匹配 如果不匹配 则继续移动到下一行 请参阅下面的我的代码 它运行时
  • 集群上运行的 Dask 程序出现文件未找到错误

    我有 4 台机器 M1 M2 M3 和 M4 调度程序 客户端 工作线程都在 M1 上运行 我已将 csv 文件放入 M1 中 其余的机器都是工人 当我在 dask 中使用 read csv 文件运行程序时 它给我错误 找不到文件 当您的一
  • 如何运行新的 gradle 任务?

    我在 build gradle 中创建了一个新的 gradle 任务 task callCL type Exec println hello commandLine rerun sh 假设运行 rerun sh bin bash cucum
  • 无法在 Windows 8 Metro 风格应用程序中使用 IPAddress 或类似类型

    我发现使用有困难System Net IPAddress或 Windows 8 Metro 应用程序中的任何类似类型 我正在创建一个将在 Intranet 环境中运行的应用程序 用户将使用 IPAddress 连接到远程服务器 但不知何故我
  • 如何调试复杂的 IF Excel 公式?

    我是一名学校老师 正在开发学校的评估系统 我应该怎么做才能纠正这个公式 IF H3 SUR IF Subject C3 lt 2 7 Not on track IF Subject C3 lt 3 29 On track IF Subjec
  • 卡夫卡消费者错误:标记协调员死亡

    我有一个在 Kafka 0 10 0 1 集群中有 10 个分区的主题 我有一个生成多个消费者线程的应用程序 对于这个主题 我生成了 5 个线程 我在我的应用程序日志中多次看到此条目 INFO AbstractCoordinator 600
  • Cython cimport 找不到 .pxd 模块

    已解决 请参阅编辑 3 假设包的结构如下 Some Package some package init py core init py definition pxd helper init py helper pxd helper pyx
  • 如何发送带有 header 参数的 HTTP 请求?

    一般来说 我对 javascript 和网络编程非常陌生 我需要一些帮助 我有一个 HTTP 请求 需要通过 javascript 发送 并需要将输出存储在变量中 我尝试仅使用呼叫网址 https api fantasydata net n
  • OpenXML SpreadsheetDocument SaveAs() 给出文件使用中错误

    我正在尝试使用从 ASP Net Core Web 应用程序调用的 OpenXMLPowerTools v4 5 3 2 DocumentFormat OpenXML v2 9 1 动态生成 Excel 电子表格 我已经验证能够正常生成电子
  • std::thread,在“this”上启动线程(从类本身内部)

    我正在尝试创建一个类 该类启动其成员方法之一的线程实例 当我在 main 中执行操作时 test myinstance std thread mythread myinstance 然后事情编译 但使用以下结构 include