C ++,如何使用另一个类的线程更改另一个类的变量

时间:2016-07-07 15:10:14

标签: c++ pthreads

我有两个A和B类。我想要的是使用pthread.h更改A类变量的B类:

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;
}

问题是 static void setVHelper(void * context)*只能有一个参数....那么如何从另一个类中更改变量呢?

1 个答案:

答案 0 :(得分:1)

你被限制在一个论点上是正确的。 pthread_create采用的第三个参数是void* start_routine(void* argument)。解决这个问题的方法是将子线程所需的内容打包到结构中。在提供的示例中,在B的类声明和函数实现之间,添加

struct thread_arguments
{
    A* a_ptr;
}

然后在调用pthread_create之前,创建一个动态分配的结构并将其作为第四个参数传递给pthread_create:

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

轰!你已经偷了一些额外的信息到子线程中。您还必须对setVHelper函数进行另一项更改。由于它是一个void指针,你必须将它强制转换为刚才定义的struct类型。所以在while循环之前你有:

thread_arguments* context = (thread_arguments*)context_ptr;

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

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

情侣旁注,1。)我建议你将指针打包到结构中,因为它避免了不必要的对象复制。 2.)将您的函数定义为,您的示例将无论如何都会失败,因为类A的对象必须作为setV中的参数传递。 3)确保在完成结构后清理结构:)