首页 > 其他分享 >多线程问题:异常处理,单例

多线程问题:异常处理,单例

时间:2024-09-23 17:24:54浏览次数:1  
标签:std 初始化 Singleton flag 单例 多线程 异常 ptr once

1)多线程异常处理
多线程中如何捕获抛出异常到主线程

a)catch中使用std::current_exception();获得正在处理的异常
b)通过引用类型std::exception_ptr& _ex_ptr 传出
c)std::rethrow_exception(ex_ptr);重新抛出异常


using namespace std;
	
	try {
		std::exception_ptr ex_ptr;

		thread th([](std::exception_ptr& _ex_ptr) {
			try {
				int sum = 0;
				for (int i = 0; i <= 9; i++)
				{
					sum += i;
				}
				throw(std::runtime_error("error level:1"));
			}
			catch (std::exception& _ex)
			{
				_ex_ptr = std::current_exception();
				//获得当前正在处理的异常
			}


		}, ref(ex_ptr));
		th.join();

		if(ex_ptr)
			std::rethrow_exception(ex_ptr);
			//重新抛出异常
	}
	catch (std::exception& ex)
	{
		cout << "exception:" << ex.what() << endl;

	}

2)多线程中(单例类)类对象的初始化问题
a)双重检查锁定:
减少同步开销:只有在实例尚未创建时才需要获取锁,减少了锁的竞争,提高了性能。
大多数情况下,实例已经创建,第二次检查和锁的获取可以避免。

b) C++11 标准保证了静态局部变量的线程安全初始化,可以简化单例模式的实现。

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 线程安全的静态局部变量
        return instance;
    }

private:
    Singleton() {} // 私有构造函数,确保单例模式
    ~Singleton() {} // 私有析构函数,确保单例模式

    Singleton(const Singleton&) = delete; // 禁用拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 禁用赋值操作符
};

c) call once;
C++11 提出了call_once函数,我们可以配合一个局部的静态变量once_flag实现线程安全的初始化。 多线程调用call_once函数时,会判断once_flag是否被初始化,
如没被初始化则进入初始化流程,调用我们提供的初始化函数。 但是同一时刻只有一个线程能进入这个初始化函数


class Bolala {
public:
	

	static Bolala* get_Instance()
	{
		static std::once_flag s_flag;
//std::call_once(once_flag,function)
		std::call_once(s_flag, []() {
			bola_ptr = new Bolala();
			std::cout << "once init" << std::endl;
		});
		return bola_ptr;
		
	}
private:
	static Bolala* bola_ptr;
	

};
Bolala* Bolala::bola_ptr = nullptr;

为什么 s_flag 不需要显式初始化?而bola_ptr 需要
零初始化:std::once_flag 是一个标准库提供的类型,它的默认构造函数会将其内部状态初始化为一个“未调用”状态。
这意味着 std::once_flag 在声明时已经自动初始化为一个有效的状态。
局部静态变量:s_flag 是一个局部静态变量,C++ 标准保证局部静态变量在第一次被使用前会被自动初始化。因此,你不需要显式初始化 s_flag。
C++ 标准规定,静态成员变量必须在类外部进行初始化。因此,你需要在类外部显式初始化 bola_ptr

局部静态变量:s_flag 是一个局部静态变量,C++ 标准保证局部静态变量在第一次被使用前会被自动初始化。因此,你不需要显式初始化 s_flag。

标签:std,初始化,Singleton,flag,单例,多线程,异常,ptr,once
From: https://www.cnblogs.com/light-LifeClub/p/18425036

相关文章

  • dede数据库连接异常的解决过程
    当遇到DedeCMS(织梦CMS)数据库连接异常的情况时,可以按照以下步骤进行排查和解决:检查数据库配置首先确保数据库配置文件data/common.inc.php中的数据库连接信息(如数据库地址、用户名、密码)是正确的。如果不确定,可以通过FTP工具下载该文件并用文本编辑器打开查看或修改。清理......
  • 面试:多线程顺序打印
            在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。比如说:使用join方法,T3调用T2,T2调用T1,这样就能确保T1就会先完成而T3最后完成。        定义三个类,分别实现Runnable接......
  • c++多线程,锁
    1)机器最大线程数uint16_tmax_thread=thread::hardware_concurrency();2)vector中管理线程获取线程ida)thread::id_id=std::this_thread::get_id();b)threadth(getSum_vector,ref(arr),ref(_sum));cout<<th.get_id();容器中存储线程变量:使用emplace_back原位构造a......
  • scala的单例对象
    在定义时,使用private修饰的属性有什么特点  用object关键字来创建一个单例对象,单例对象在整个应用程序中只有一个实例,适合用于存放工具方法,常量或共享状态  伴生类和伴生对象 访问私有方法   ......
  • 深度解析APS系统异常预警处理:从识别到解决的全流程策略
    订单发生变更当企业接收到产品加工订单发生变更的通知时,立即启动快速响应机制。包括指派专人负责跟进此事,并确保该信息能够迅速传递到所有相关部门和人员。同时,直接访问APS(高级计划与排程)系统,准备对受影响的订单进行详细审查。1.确认变更在APS系统中,详细检查发生变更的订单信......
  • 时间序列无监督异常点检测算法_孤立森林,局部离群因子检测和自编码器
    数据入口:压气机异常检测一维时间序列-Heywhale.com该数据为采样自工业压气机的一维时间序列数据。本文将通过无监督时间序列算法进行时间序列异常检测。针对时间序列数据,常用的无监督异常检测算法包括:孤立森林(IsolationForest)、基于密度的局部离群因子检测(LOF)、自编码器(Au......
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
    1、装饰器概念        装饰器是Python中用于修改函数或类的语法结构的工具。它以函数作为输入参数,并返回一个函数作为一个输出函数,在不改变原有函数的代码情况下,给函数增加功能或改变函数行为。        装饰器的使用方式是在函数定义的上方使用@decorator_n......
  • 线程的概念与多线程模型
    目录线程的概念线程的属性多线程模型一对多模型​编辑​编辑​编辑多对一模型多对多模型​编辑​编辑线程的概念首先先了解有线程和没线程的区别没线程的进程:进程间虽可以相互切换并发执行,但每个进程内的程序不能相互切换并发执行。就比如你可以一边听音乐一遍聊微......
  • Excel的背面(1) — Pywin32调用异常、MSO与KET之争
    在上一篇博文中我提到了Excel批注有关的问题,这里我并不打算马上更新Excel歪门邪道,毕竟我可供更新的内容实在是太少了,这也对应了我过去失败的29年,恍恍惚惚出生,恍恍惚惚工作,恍恍惚惚之间步入低谷,从来就没有哪一刻想过要成为成年人,最后不过是有着成年人躯壳的小孩。Excel相关的内容因......
  • 微软:LLM对输入异常敏感
    ......