gpt4 book ai didi

c++ - 从 std::thread 访问类变量

转载 作者:太空狗 更新时间:2023-10-29 20:12:43 24 4
gpt4 key购买 nike

我有以下类启动了一个新的 std::thread。我现在想让线程访问类的一个成员变量。到目前为止,我不知道该怎么做。在我的 MyThread 函数中,我想检查 m_Continue。

我尝试在创建线程时传入“this”,但出现错误:

错误 1 ​​error 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;
}

我该怎么做?

最佳答案

如果你想访问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>为了在一个线程上设置它并以明确定义的行为在另一个线程上读取它。

关于c++ - 从 std::thread 访问类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com