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

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.lryc.cn/news/210176.html

相关文章:

  • linux上安装apktool反编译apk解析AndroidManifest.xml得到首页Activity
  • 代码随想录算法训练营第4天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II
  • 【面向对象程序设计】Java大作业 汽车租赁管理系统V4.0
  • golang模拟QQ退出后自动重启
  • jQuery中ajax如何使用
  • redis集群的多key原子性操作如何实现?
  • 密码学与网络安全:量子计算的威胁与解决方案
  • GoLong的学习之路(十二)语法之标准库 flag的使用
  • mac git ssh
  • 栈、共享栈、链式栈(C++实现)
  • MySQL实战2
  • 【面试经典150 | 栈】简化路径
  • 无线电编码和记录和静音检测器 PlayOutONE LiveStream 5.0
  • React中useEffect Hook使用纠错
  • 0049【Edabit ★☆☆☆☆☆】【修改Bug代码】Buggy Code
  • javaswing/gui的科学计算器
  • Chapter1:C++概述
  • 实战经验分享FastAPI 是什么
  • Edge浏览器中常用的20个快捷键
  • winscp显示隐藏文件
  • uniapp获取地理位置的API是什么?
  • 【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...
  • C#,数值计算——分类与推理,基座向量机的 Svmgenkernel的计算方法与源程序
  • 08.K8S高可用方案
  • MySQL实战1
  • 关于A level的习题答案
  • 左神算法题系列:动态规划机器人走路
  • LeetCode75——Day19
  • ToLua使用原生C#List和Dictionary
  • WebDAV之π-Disk派盘 + 言叶