c++ - 为类对象创建线程

标签 c++ multithreading class

我有类对象 Chat *p,我希望在其上运行方法 Foo(int num)(通常由 p 运行-> 例如 Foo(3))。 我写了这段代码:

    std::thread F(&Chat::Foo, 4);

不过,它没有编译给我,而且我也看到了一个错误,因为我无法将 p -> Foo 放入其中(而不是 &Chat::Foo ...)

如何正确运行这段代码?

谢谢!

最佳答案

对象方法实际工作原理的答案。当您调用 p->foo(3) 时,编译器将其翻译成什么,粗略地说,就是 Chat::foo(p, 3)P 在对函数的任何调用中始终作为隐藏参数传递。 C++ 不会向您展示这一点,您实际上也不能调用 Chat::foo(p, 3),这是不允许的,但它大致说明了现实中的工作原理。

在任何成员函数中可用的变量 this 只是作为隐藏的第一个参数传入的地址,您在函数中访问的任何成员变量都引用隐藏的第一个参数。所以......为了调用任何成员函数作为线程的起点,你需要做的是将指针传递给对象作为它的第一个参数。 std::thread F(&Chat::Foo, p, 4); 我相信会正确启动线程。

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

相关文章:

c# - C# 中的简单线程

C#取消一个非循环的长时间运行的任务

c# - 分配给未执行的新线程的方法

c++ - 如何调用仅给出其名称的方法?

c++ - C++中复制构造函数的困惑

c++ - 是什么导致该张量外积中出现无限模板递归?

CSS 模糊页面上的每个元素,除了悬停的元素

Python - 文本文件数据可以存储在代码中吗?

c++ - 以下代码是关于将经过排序的错误旋转某个值d

c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?