从另一个线程访问类函数?

时间:2010-07-06 19:12:46

标签: c++ multithreading class

我的类中有一个函数,它创建一个线程并给它调用一个函数的参数,该函数是该类的一部分,但由于线程procs必须是静态的,我无法访问任何类的成员。如果不使用cpp文件中的一堆静态成员临时提供数据操作,怎么办呢,这看起来很慢。

以下是我的意思的一个例子:

在cpp文件中:

void myclass::SetNumber(int number)
{
   numberfromclass = number;
}

void ThreadProc(void *arg)
{

   //Can't do this
   myclass::SetNumber((int)arg);
}

我不能这样做,因为SetNumber必须是静态的,但是我的课程很多,所以不会起作用。

我该怎么办?

由于

2 个答案:

答案 0 :(得分:1)

通常你将myclass对象的地址指定为arg类型并将其强制转换为ThreadProc。但是,你将被阻止如何传递int参数。

void ThreadProc(void *arg)
{
   myclass* obj = reinterpret_cast<myclass*>(arg);
   //Can't do this
   obj->SetNumber(???);
}

正如你所说,这可能不仅有点慢,而且还会使代码混乱。我建议使用boost::bind进行参数绑定,并以os独立的方式创建线程(至少对于你自己的源),你可以使用boost::thread。那么你的线程就不需要静态方法了。

现在在C ++ 0x标准中,这里是small tutorial

答案 1 :(得分:0)

我建议你为此目的用static方法制作一个友好的课程。它看起来更干净。例如: -

class FriendClass
{
public:
  static void staticPublicFunc(void* );
};

现在在你的主要班级与上述班级成为朋友......

class MyClass
{
  friend void FriendClass::staticPublicFunc(void*);
};

这使您可以将friend-function设置为thread-function并访问每个线程中每个实例的类。确保同步访问跨线程可见的数据。