为啥线程过程应该是静态或成员函数

Posted

技术标签:

【中文标题】为啥线程过程应该是静态或成员函数【英文标题】:why does thread procedure should be static or member function为什么线程过程应该是静态或成员函数 【发布时间】:2010-09-08 14:27:13 【问题描述】:

为什么线程过程应该是静态或成员函数? 有什么正当理由吗?

【问题讨论】:

没有更具体的上下文编号。顺便说一句,标记 MFC 和 PThreads 的任何特殊原因?我认为同时使用这两个库的情况很少见。 【参考方案1】:

非静态成员变量具有编译器内部传递的隐式this 参数。

你有

ClassInQuestion 
   void threadFunc( int );

编译器在内部创建一个函数

void ClassInQuestion_threadFunc( ClassInQuestion* thisObject, int );

因此,除非线程过程接受一个指针 t 一个具有ClassInQuestion* 类型的第一个参数的函数,否则它将与预期的函数签名不匹配。

【讨论】:

我也误读了这个问题,但是对于 mfc,以下表明需要一个免费或静态成员函数:go4expert.com/forums/showthread.php?t=3197 和 pthreads (C-API),这似乎很明显,所以我猜这个问题有点草率。【参考方案2】:

主要是因为非静态成员函数有一个隐含的参数,导致函数指针的填写比较困难。我猜想在指定非静态成员函数时,您还希望对象是已知的,这与函数的工作方式不同。

【讨论】:

【参考方案3】:

通常,线程过程必须由具有回调机制的线程库中的预定义函数调用。为了能够调用成员函数(不是静态的),您需要调用该函数的类的对象。但是,没有可用的线程库支持这一点,即它们不接受将用于调用注册函数的对象。所以所有这些函数都应该是静态的并适当地进行类型转换。

【讨论】:

以上是关于为啥线程过程应该是静态或成员函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++17 中的全局内联变量和静态内联成员需要守卫?

将线程函数声明为静态函数的问题

为啥 const 函数可以使用静态成员对象的非常量函数?

python 为啥要使用静态方法

为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?

线程安全和静态函数