2016-07-07 80 views
0

我有两个类A和B.我要的是B级使用pthread.h改变A类的变量:C++,如何改变另一个类的变量与其他类的线程

class A 
{ 
public: 
    double v; 
} 
class B 
{ 
public: 
    void commencingExecution(A& a); 
    static void * setVHelper(void* context); 
    void setV(A& a); 
} 



void B::commencingExecution(A& a); 
{ 
    pthread_t set_v_thread; 
    int iret = pthread_create(&set_v_thread, NULL, B::setVHelper, this); 
} 

void * B::setVHelper(void* context) 
{ 
    while(1) 
    { 
     ((B *)context)->setV(); 
    } 
} 

void B::setV(A& a) 
{ 
    a.v = 1; 
} 

问题是,静态无效 setVHelper(void * context)*只能有一个参数....所以我怎样才能改变另一个类的变量?

+1

如果setVHelper只能有一个类型为void *的参数,那么您可以创建一个包含指向类A和指向B类的指针并将其作为参数传递? 'struct {A * a_ptr; B * b_ptr} param_struct;' – mgarey

回答

1

你被限制在一个参数中是正确的。 pthread_create需要的第三个参数是void* start_routine(void* argument)。你解决这个问题的方式是将你需要的子线程打包到一个结构中。在提供的示例中,B的类声明和功能实现之间,添加的东西沿着

struct thread_arguments 
{ 
    A* a_ptr; 
} 

线然后你调用pthread_create之前,创建一个动态分配的结构,并传递作为第四argumetn给pthread_create:

thread_arguments* args = new thread_arguments; 
args.a_ptr = &a; 
int iret = pthread_create(&set_v_thread, NULL, B::setVHelper, args); 

热潮!你已经将一些额外的信息隐藏到子线程中。还有一个你必须对你的setVHelper函数做出的改变。由于它是作为一个空指针来实现的,所以你必须将它转换为刚刚定义的结构类型。因此,while循环之前,你必须:

thread_arguments* context = (thread_arguments*)context_ptr; 

现在,您将能够访问您通过箭头符号传递给子线程的结构。

while(1) 
{ 
    setV(context_ptr->a_ptr); 
} 

夫妻方面的注意事项1.)我建议你在结构中封装一个指针,因为它避免了不必要的对象复制。 2)如果你的函数定义为你的例子,反正会失败,因为类A的对象必须作为参数传递给setV。 3)确保在清理结构时清理它:)

相关问题