Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从另一个thead访问类函数?_C++_Multithreading_Class - Fatal编程技术网

C++ 从另一个thead访问类函数?

C++ 从另一个thead访问类函数?,c++,multithreading,class,C++,Multithreading,Class,我的类中有一个函数,它创建一个线程,并为它提供参数来调用属于该类的函数,但由于线程进程必须是静态的,因此我无法访问该类的任何成员。如果不使用cpp文件中的一组静态成员来临时提供要处理的数据,如何做到这一点,这似乎很慢 以下是我的意思的一个例子: 在cpp文件中: void myclass::SetNumber(int number) { numberfromclass = number; } void ThreadProc(void *arg) { //Can't do this

我的类中有一个函数,它创建一个线程,并为它提供参数来调用属于该类的函数,但由于线程进程必须是静态的,因此我无法访问该类的任何成员。如果不使用cpp文件中的一组静态成员来临时提供要处理的数据,如何做到这一点,这似乎很慢

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

在cpp文件中:

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

void ThreadProc(void *arg)
{

   //Can't do this
   myclass::SetNumber((int)arg);
}
我不能这样做,因为SetNumber必须是静态的,但我经常引用我的类,所以这不起作用

我能做什么


谢谢

通常您将myclass对象的地址指定为
arg
type,并将其强制转换到ThreadProc中。但是,您将无法了解如何传递int参数

void ThreadProc(void *arg)
{
   myclass* obj = reinterpret_cast<myclass*>(arg);
   //Can't do this
   obj->SetNumber(???);
}
void ThreadProc(void*arg)
{
myclass*obj=重新解释铸件(arg);
//不能这样做
obj->SetNumber(???);
}
正如您所说,这可能不仅有点慢,而且会使代码混乱。我建议将其用于参数绑定,并以您可以使用的独立于操作系统的方式(至少对于您自己的源代码)创建线程。那么线程就不需要静态方法了


现在在C++0x标准中,这里有一个

我建议您为此使用一个
静态
方法创建一个友好的类。看起来干净多了。例如:-

class FriendClass
{
public:
  static void staticPublicFunc(void* );
};
现在在你的主课上和上面的同学交朋友

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

这应该使您能够将
友元函数
设置为
线程函数
,并在每个线程中访问每个实例的类。确保同步您对跨线程可见数据的访问。

哦,好吧,我只传递一个结构,其中1个成员是自指针,如果您真的反对boost使用,这可能是一个解决方案。但是请注意,这些东西现在是主要编译器支持的新C++0x标准的一部分,因此使用起来并不奇怪。它们在不同的名称空间中:std而不是boost