此代码编译(使用g ++(GCC)6.3.1)并且似乎“正常工作”。但我对它是否构成 良好做法 持怀疑态度。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
class ThreadObj
{
public:
void *memberFunction(void*);
void startThread(void);
static int w;
};
int ThreadObj::w = 13;
void* ThreadObj::memberFunction(void*)
{
w = 17;
return 0;
}
void ThreadObj::startThread(void)
{
void * (*p)(void *) = *((void * (*)(void *))&ThreadObj::memberFunction);
pthread_t tid;
if (pthread_create(&tid, 0, p, this) == 0)
pthread_detach(tid);
}
int main(int argc, char *argv[] )
{
ThreadObj thr;
thr.startThread();
return 0;
}
将指向成员函数的指针作为指向C函数的指针并将this
作为数据传递似乎依赖于(TOO MUCH)编译器选择如何解释/编译它的优点。
以前已经介绍过,但没有明确答复。
如何破坏这个例子?
答案 0 :(得分:1)
旧的方式(使用最近的语法)是:
class ThreadObj
{
public:
void memberFunction() { w = 17;}
void startThread() {
pthread_t tid;
if (pthread_create(&tid, 0, &Func, this) == 0) {
pthread_detach(tid);
}
}
static void* Func(void* p) {
auto* that = static_cast<ThreadObj*>(p);
that->memberFunction();
return nullptr;
}
private:
int w = 13;
};
但是在c ++ 11中,std::thread
有更好的界面。
答案 1 :(得分:0)
不是真的。它的未定义行为。虽然很可爱。无论它是否有效都有点悬而未决。我的猜测通常是。
代码的作者正在利用this
通常作为成员函数实现的第一个参数传递的事实。
答案 2 :(得分:0)
使用指向classe方法的指针是非常有用的,对我来说,这是一个很好的实践,因为它允许您实现另一种模式,例如:触发具有相同原型方法的severas类上的事件。
回答你的问题:这是一个设计问题以及它如何对你的目标有用。
我分享了一个代码,我在同一个类的differents方法中创建两个线程,我希望你能帮到你。
https://github.com/jorgemedra/C-11-Threads/blob/master/README.md