我有以下类启动一个新的std :: thread。我现在希望线程访问该类的成员变量。到目前为止,我无法弄清楚如何做到这一点。 在我的MyThread函数中,我想检查m_Continue。
我试过传递这个'创建线程但我收到错误:
错误1错误C2197:' void(__ cdecl *)(void)' :调用c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ functional 1152 1 MyProject 的参数太多。
class SingletonClass
{
public:
SingletonClass();
virtual ~SingletonClass(){};
static SingletonClass& Instance();
void DoSomething();
private:
static void MyThread();
std::thread* m_Thread;
bool m_Continue;
};
SingletonClass::SingletonClass()
{
m_Continue = true;
m_Thread= new std::thread(MyThread, this);
}
void SingletonClass::MyThread()
{
while(this->m_Continue )
{
// do something
}
}
void SingletonClass::DoSomething()
{
m_Continue = false;
}
SingletonClass& SingletonClass::Instance()
{
static SingletonClass _instance;
return _instance;
}
int _tmain(int argc, _TCHAR* argv[])
{
SingletonClass& singleton = SingletonClass::Instance();
singleton.DoSomething();
return 0;
}
我该怎么做?
答案 0 :(得分:5)
如果你想从线程函数中访问this
,那么它不应该是静态的:
void MyThread();
现在,您可以简单地将this
作为第二个thread
构造函数参数传递,就像您尝试的那样;但是,作为非静态成员,您需要对其名称进行限定:
m_Thread= new std::thread(&SingletonClass::MyThread, this);
或者,您可能会发现lambda更容易阅读:
m_Thread= new std::thread([this]{MyThread();});
但你不应该用指针和new
那样捣乱;将成员变量设为thread
对象,并在初始化列表中初始化它:
SingletonClass::SingletonClass() :
m_Continue(true), m_Thread([this]{MyThread();})
{}
确保在其访问的任何其他成员之后声明m_Thread
;并确保在析构函数中停止并加入线程,或更早。
最后,m_Continue
应为std::atomic<bool>
,以便将其设置在一个线程上,并在具有明确定义的行为的另一个线程上读取它。
答案 1 :(得分:2)
替换
static void MyThread();
带
void MyThread();
as
this
无法在static
方法中访问。
答案 2 :(得分:0)
如果成员变量是公共变量,您可以访问该成员变量,或者您可以使用返回m_Continue的方法“bool shallContinue()”。
现在你是怎么做到的。请查看以下修改后的代码段:
static void SingletonClass::MyThread(SingleTonClass *arg)
{
while(arg->shallContinue() )
{
// do something
}
}
下面是一个完整的例子:
#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
class A
{
public:
A(int x) : a(x)
{
thr = new thread(myThread, this);
}
static void myThread(A *arg)
{
arg->show();
}
void show()
{
cout << a << endl;
}
private:
int a;
thread *thr;
};
int main()
{
A a(1);
sleep(2);
return 0;
}