C++,如何用另一个 class 的线程更改另一个 class 的变量
C++, how to change variables of another class with a thread of another class
我有两个 classes A 和 B。我想要的是 class B 使用 pthread.h:[=13= 更改 class A 的变量]
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)* 只能有一个参数....那么我怎样才能改变另一个变量class?
你说的仅限于一个论点是正确的。 pthread_create 采用的第三个参数是 void* start_routine(void* argument)
。解决这个问题的方法是将子线程所需的内容打包到一个结构中。在提供的示例中,在 B 的 class 声明和函数实现之间,添加类似于
的内容
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 指针,您必须将它转换为您刚刚定义的结构类型。所以在 while 循环之前你有:
thread_arguments* context = (thread_arguments*)context_ptr;
现在您将能够通过箭头符号访问您传递给子线程的结构。
while(1)
{
setV(context_ptr->a_ptr);
}
一些旁注,1.) 我建议您将指针封装到结构中,因为它可以避免不必要的对象复制。 2.) 如果你的函数按原样定义,你的例子无论如何都会失败,因为 class A 的对象必须作为参数传递给 setV
。 3) 确保在完成结构后清理它:)
我有两个 classes A 和 B。我想要的是 class B 使用 pthread.h:[=13= 更改 class A 的变量]
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)* 只能有一个参数....那么我怎样才能改变另一个变量class?
你说的仅限于一个论点是正确的。 pthread_create 采用的第三个参数是 void* start_routine(void* argument)
。解决这个问题的方法是将子线程所需的内容打包到一个结构中。在提供的示例中,在 B 的 class 声明和函数实现之间,添加类似于
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 指针,您必须将它转换为您刚刚定义的结构类型。所以在 while 循环之前你有:
thread_arguments* context = (thread_arguments*)context_ptr;
现在您将能够通过箭头符号访问您传递给子线程的结构。
while(1)
{
setV(context_ptr->a_ptr);
}
一些旁注,1.) 我建议您将指针封装到结构中,因为它可以避免不必要的对象复制。 2.) 如果你的函数按原样定义,你的例子无论如何都会失败,因为 class A 的对象必须作为参数传递给 setV
。 3) 确保在完成结构后清理它:)