美文网首页
C++ 静态变量中使用了条件变量导致主线程无法退出的问题

C++ 静态变量中使用了条件变量导致主线程无法退出的问题

作者: 飞天小小猫 | 来源:发表于2021-08-31 22:19 被阅读0次

记录下一个因为静态变量中使用了条件变量导致主线程无法退出的问题。

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>

class AppAgent
{
private:
    /* data */
public:
    AppAgent() = default;
    ~AppAgent() {
        std::cout << "destruct appagent" << std::endl;
         // 解决方法2:
         // 在这里通知下条件变量,确保没有等待,能够正常执行析构
         // 参考: http://www.cplusplus.com/reference/condition_variable/condition_variable/~condition_variable/
        // condition_.notify_all();
    };

    static AppAgent &GetInstance()
    {
        static AppAgent instance;
        return instance;
    }

    void Init()
    {
        std::cout << "init" << std::endl;
    }
    int WaitForPubWork()
    {
        new_msg_ = false;
        std::unique_lock<std::mutex> lck(mtx_);
        while (!new_msg_)
        {
            condition_.wait(lck);
            std::cout << "hh" << std::endl;
            new_msg_ = true;
        }
        std::cout << "iii" << std::endl;
        new_msg_ = false;
    }

private:
    bool new_msg_;
    std::condition_variable condition_;
    std::mutex mtx_;
};

void dotask()
{
    AppAgent::GetInstance().Init();
    while (1)
    {
        AppAgent::GetInstance().WaitForPubWork();
    }
}

int main()
{
    // 问题: 进程无法主动退出, 即便是子线程被detach
    std::thread t1(dotask);
    t1.detach();
    std::this_thread::sleep_for(std::chrono::seconds(2));

    std::cout << "exit main" << std::endl;
    // 解决方法1: 可以使用quick_exit(0),不执行析构,快速退出。
    // quick_exit(0);
    return 0;
}

涉及到的问题点:

  1. 静态变量的析构顺序,是在main主线程退出之后才进行的
  2. 条件变量的析构正常执行的条件,是没有等待的场景,也就是说,析构前,需要提前唤醒一下

参考资料:
Google C++编程规范 – 第二十八条 -《静态变量和全局变量》
C++构造与析构(18) - 静态对象(static object)何时销毁
http://www.cplusplus.com/reference/condition_variable/condition_variable/~condition_variable/

相关文章

  • C++ 静态变量中使用了条件变量导致主线程无法退出的问题

    记录下一个因为静态变量中使用了条件变量导致主线程无法退出的问题。 涉及到的问题点: 静态变量的析构顺序,是在mai...

  • C++中的成员变量和成员函数

    C++中的类有两个成分: (1)成员变量 成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默...

  • 工具类中使用@Value给静态变量注入值

    1.问题 在SpringBoot中使用@value注解只能给普通变量注入值,不能直接给静态变量赋值,直接给静态变量...

  • 线程

    简单线程 带参线程 最大线程数 mutex c++版本 纯c++版本 纯c版本 条件变量(condition) 信...

  • java中的多线程之ThreadLocal

    问题提出:当我们在一个多线程的环境中使用了全局变量,这个全局变量就存在一定被篡改的风险;为了避免共享变量的使用这种...

  • 线程安全问题

    线程安全问题通常是由全局以及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个...

  • TLS(线程本地存储)

    TLS是一种在多线程时使用的技术,它可以使你的全局变量、静态变量以及局部静态、静态成员变量成为线程独立的变量,即每...

  • C++中的静态成员

    静态成员变量 在C++中可以定义静态成员变量静态成员变量属于整个类所有静态成员变量的生命期不依赖于任何对象可以通过...

  • Java多线程并发笔记

    多线程并发带来的问题: 1、缓存不一致变量存储在主内存中,每个线程有自己的工作内存,线程读取变量,会先将变量从主内...

  • JAVA高级开发-学习笔记(volatile关键字)

    一、变量分为哪几类 全局变量 = 属性(静态的、非静态的)局部变量 = 本地变量、参数 二、多线程间共享数据 全局...

网友评论

      本文标题:C++ 静态变量中使用了条件变量导致主线程无法退出的问题

      本文链接:https://www.haomeiwen.com/subject/atstwltx.html