C线程可以访问类变量

C线程可以访问类变量,第1张

概述在使用线程一段时间后,我遇到了一种情况,我需要一个线程永远运行,直到调用一个函数(或任何类型的事件).为此,我创建了一个bool值来控制线程执行的函数内部的while循环,但我很快注意到在线程开始运行后外部变量没有更新,导致线程在被要求时永远不会停止. 下面是一些代表问题的简单代码: #include <cstdio>#include <thread>#include <chrono>cl 在使用线程一段时间后,我遇到了一种情况,我需要一个线程永远运行,直到调用一个函数(或任何类型的事件).为此,我创建了一个bool值来控制线程执行的函数内部的while循环,但我很快注意到在线程开始运行后外部变量没有更新,导致线程在被要求时永远不会停止.

下面是一些代表问题的简单代码:

#include <cstdio>#include <thread>#include <chrono>class A {public:    A();    voID startThread();    voID endThread();private:    voID threadCall();    bool active;};int main() {    A threadThing;    threadThing.startThread();    printf("[M] Thread Created\n");    std::this_thread::sleep_for(std::chrono::seconds(5));    threadThing.endThread();    printf("[M] Thread Killed\n");    std::this_thread::sleep_for(std::chrono::seconds(5));    return 0;}A::A() {    active = false;}voID A::startThread() {    active = true;    std::thread AThread(&A::threadCall,*this);    AThread.detach();}voID A::endThread() {    active = false;}voID A::threadCall() {    printf("[T] Thread Started\n");    while (active) {        std::this_thread::sleep_for(std::chrono::seconds(2));    }    printf("[T] Thread Ended\n");}

预期的结果是主函数启动线程,线程说它开始,然后4秒后线程被杀死,线程说它结束,而实际上线程永远不会说它结束.有没有办法让线程访问’active’变量,或者我的方法是否完全不正确? (旁注,我确实尝试自己解决这个问题,但只有像本地线程存储这样的东西,它似乎只是用于存储在线程中,不能访问外部但我可能是错的)

解决方法 问题在于std :: thread的构造函数,它默认复制/移动.
std::thread AThread(&A::threadCall,*this);

这会将对象复制到新线程中,因此检查新对象中的活动变量无效.

你可以删除*

std::thread AThread(&A::threadCall,this);

你将对象指针传递给新线程,它将调用像这样的方法(* this).threadCall().

编辑:正如评论所说,这不能保证线程安全,你需要使用std :: atomic< bool>为了安全起见.

总结

以上是内存溢出为你收集整理的C线程可以访问类变量全部内容,希望文章能够帮你解决C线程可以访问类变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存