C++,如何使用另一个类的线程更改另一个类的变量
C++, how to change variables of another class with a thread of another class
我有两个A类和B类。我想要的是 B 类使用 pthread.h 更改类 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;
}
问题是静态 void setVHelper(void* context)* 只能有一个参数。那么如何从另一个类更改变量呢?
你被
限制在一个参数上是正确的。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 指针提供的,因此必须将其强制转换为刚刚定义的结构类型。因此,在 while 循环之前,您有:
thread_arguments* context = (thread_arguments*)context_ptr;
现在,您将能够访问通过箭头表示法传递给子线程的结构。
while(1)
{
setV(context_ptr->a_ptr);
}
几个旁注,1.)我建议您将指针打包到结构中,因为它可以避免不必要的对象复制。2.) 将您的函数定义为原样,您的示例无论如何都会失败,因为类 A 的对象必须作为 setV
中的参数传递。3)确保在完成结构后清理结构:)
相关文章:
- 一个变量的输入值也会保存到另一个变量中
- 将双精度变量设置为另一个变量的值
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何将行的第一个单词作为一个变量,将行的其余部分作为另一个变量进行归档/存储
- 打印一个变量将打印另一个变量的值(以 C++ 为单位)
- 如何将一个变量声明为另一个变量的值
- C BITSHIFT导致另一个变量引起问题
- C++字符串类如何将一个变量转换为另一个变量?
- 如何将字符串作为变量与另一个变量字符串进行比较
- C++循环变量按另一个变量递增
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- C 如何基于另一个变量和某些算术定义变量的值
- 我可以使用变量模板声明另一个变量模板
- 在C++中使用另一个变量作为数组索引限制
- 当类名存储在另一个变量中时,如何创建类的实例
- 如何在 switch 语句之后将变量添加到另一个变量
- 从另一个变量访问变量
- 如何使用另一个变量声明一个变量