当前位置: 首页 > article >正文

c++ 线程安全的string类

非安全string

说明

c++标准未规定stl容器以及字符串的线程安全性,故std::string在多线程下是不安全的。

代码示例

#include <iostream>
#include <stdio.h>
using namespace std;

std::string *sp = nullptr;

void Read()
{
	for(int i = 0; i < 100000; i++)
	{
		std::string  s = "";
		s = *sp;
	}
}

void Write()
{
	for(int i = 0; i < 100000; i++)
	{
		*sp = std::to_string(i);
	}
}

int main()
{
	while(1)
	{
		sp = new std::string("string test");
		std::thread t1(Read);
		std::thread t2(Write);
		t1.join();
		t2.join();
		delete sp;
		sp = nullptr;
	}

	return 0;
}

安全string

安全string类封装

  • 使用std::recursive_mutex递归锁保证string多线程下的读写安全;

关于std::recursive_mutex,可以查看:https://blog.csdn.net/www_dong/article/details/132197541

class TSString 
{
	typedef std::lock_guard<std::recursive_mutex> RecursiveGuard;
	mutable std::recursive_mutex rmutex;   // 注意增加mutable修饰
	std::string str_;

public:
	TSString() {}

	TSString(const TSString& str)
	{
		Set(str.Get());
	}

	TSString& operator= (const TSString& str)
	{
		if(this == &str)
			return *this;

		Set(str.Get());
		return *this;
	}

	void Set(const char* str)
	{
		RecursiveGuard mtx(rmutex);
		if(NULL == str)
		{
			str_ = "";
		}
		else
		{
			str_ = str;
		}
	}

	void Set(const std::string& str)
	{
		RecursiveGuard mtx(rmutex);
		str_ = str;
	}

	std::string Get() const
	{
		std::string str;
		{	
			RecursiveGuard mtx(rmutex);
			str = str_;
		}

		return str;
	}

	int Compare(const char* str) const 
	{
		if(NULL == str)
			return 1;

		RecursiveGuard mtx(rmutex);
		return str_.compare(str);
	}

	int Compare(const std::string& str) const
	{
		return Compare(str.c_str());
	}

	int Compare(const TSString& s) const
	{
		return Compare(s.Get());
	}	
};

代码示例

TSString *sp = nullptr;

void Read()
{
	for(int i = 0; i < 5000; i++)
	{
		TSString s;
		s.Set("");
		s = *sp;
	}
}

void Write()
{
	for(int i = 0; i < 5000; i++)
	{
		sp->Set(std::to_string(i));
	}
}

int main()
{
	while(1)
	{
		TSString s;
		s.Set("string test");
		sp = new TSString(s);
		std::thread t1(Read);
		std::thread t2(Write);
		t1.join();
		t2.join();
		delete sp;
		sp = nullptr;
	}

	return 0;
}

http://www.kler.cn/news/108314.html

相关文章:

  • 雨云虚拟主机使用教程WordPress博客网站搭建教程
  • 客户中心模拟(Queue and A, ACM/ICPC World Finals 2000, UVa822)rust解法
  • Element 多个Form表单 同时验证
  • SpringCore完整学习教程7,入门级别
  • ubuntu 下载Python
  • WPS中图的自动编号及引用
  • 怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)
  • 精讲双向链表的销毁
  • 【算法|动态规划 | 01背包问题No.1】AcWing 426. 开心的金明
  • springboot 项目非docker 部署自动启动
  • 【教3妹学编程-java实战5】结构体字段赋值的几种方式
  • 推理还是背诵?通过反事实任务探索语言模型的能力和局限性
  • [双指针](一) Leetcode 283.移动零和1089.复写零
  • 2.MySQL的调控按钮——启动选项和系统变量
  • 什么是离岸金融 (OFFSHORE FINANCE)
  • 关于FTP的一些往事
  • Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第四章 C++多线程系统编程精要
  • 数据库简史:多主数据库架构的由来和华为参天引擎的机遇
  • [算法]求n!在m进制下末尾有多少个0
  • Redis(09)| Reactor模式
  • Vue 数据绑定 和 数据渲染
  • 分布式消息队列:RabbitMQ(1)
  • [ROS系列]ubuntu 20.04 从零配置orbslam3(无坑版)
  • 广州华锐互动:VR虚拟现实物理学习平台,开启数字化教学新格局
  • acwing 5283. 牛棚入住
  • 应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
  • 怎么降低Linux内核驱动开发的风险?
  • 粤嵌实训医疗项目--day03(Vue + SpringBoot)
  • c# .net6 在线条码打印基于
  • 云服务器搭建Spark集群