【问题标题】:Create thread via class constructor通过类构造函数创建线程
【发布时间】:2017-05-02 14:31:00
【问题描述】:

是否可以使用指向类构造函数的函数指针来创建线程?

如果可能的话,什么时候调用类析构函数?

我已经做了这个我正在寻找的例子:

class ClassA
{
public:
    ClassA(void* argPtr)
    { ... }
};

int main(void)
{
    pthread_t thread;
    pthread_create(&thread, NULL, &ClassA(), NULL);
    return 0;
}

【问题讨论】:

  • 不,构造函数不是函数;它的地址不能被取走。 &ClassA()(如果它甚至可以编译)创建一个临时对象并获取它的地址。
  • 您可以创建一个线程,该线程调用一个函数,该函数创建一个ClassA 的实例并将调用其构造函数。
  • 您可以在构造函数中创建一个线程,然后在您的对象上运行 - 不完全相同;并且最终可能会打开其他罐头蠕虫(该对象尚未构建!)
  • 您可能需要查找<thread>。 Pthreads 用于 C,并且不理解 C++。而在现代 C++ 中,您可以调用std::thread(&std::make_unique<ClassA>).detach()。然后当unique_ptr 超出范围时将调用析构函数。

标签: c++ multithreading class constructor pthreads


【解决方案1】:

构造函数被归类为“特殊成员函数”,因为它没有名称,所以无法获取指向构造函数的指针(请注意,您使用的是类名称,而不是构造函数名称来调用它):

12.1 构造函数 [class.ctor]

1 构造函数没有名字。

...

2 构造函数用于初始化其类类型的对象。因为构造函数没有名称,所以在名称查找过程中永远找不到它们;

pthread_create 也接受一个指向常规函数的指针,而不是一个成员函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多