当前位置: 首页 > 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/a/108314.html

相关文章:

  • 车-路-站-网”信息耦合的汽车有序充电
  • ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
  • 字符及字符串(ASCII编码系统)
  • Objection
  • 【Hadoop实训】Hive 数据操作①
  • 彻底理解ARXML中的PDU
  • 雨云虚拟主机使用教程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模式