从std :: thread访问类变量

时间:2014-09-25 16:36:06

标签: c++ multithreading c++11

我有以下类启动一个新的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;
}

我该怎么做?

3 个答案:

答案 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;
}