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

51CTO学院个人网站开发视频经典 wordpress主题下载

51CTO学院个人网站开发视频,经典 wordpress主题下载,坪地网站建设效果,如何开展网络营销活动场景 在C/C多线程程序里,经常会用到对共享变量进行读写,最容易想到的是加上锁进行读写。假设当有多个线程对共享变量进行读操作时,该业务逻辑的耗时需要至少2s来进行处理,那么当一个读线程进行锁定时,其他读线程只能等…

场景

  1. C/C++多线程程序里,经常会用到对共享变量进行读写,最容易想到的是加上锁进行读写。假设当有多个线程对共享变量进行读操作时,该业务逻辑的耗时需要至少2s来进行处理,那么当一个读线程进行锁定时,其他读线程只能等待2s才会被唤醒。因为读共享变量是线程安全的,有没有方法在读的时候不需要排他锁占用?

说明

  1. C/C++14开始,提供了一个std::shared_lock共享锁,需要传入一个共享互斥量std::shared_mutex来进行读写锁操作。这个共享锁提升了多线程读共享变量的性能。
static shared_mutex rwMutex;
static string gData;...
shared_lock<shared_mutex> lock(rwMutex);
std::string str(gData);
  1. std::shared_lock的作用就是在一个线程获取到共享锁的时候,在没释放前,其他读线程可以继续获取这个共享锁,而写线程想要获取这个mutex的排他锁定,只能进入等待。
unique_lock<shared_mutex> lock(rwMutex);
gData.append(to_string(gAccumulate++)).append(":");
  1. std::shared_mutex可以作为std::unique_lock锁的参数进行排他锁定。 如果有多个写线程,那么其他写线程只能等待第一个写线程操作结束才会被唤醒去获取排他锁。

  2. C++并没有编译时的线程安全检查,默认不禁止数据竞争,如果发生数据竞争时,结果是未定义的,也就是可能导致系统崩溃。 要保证没有数据竞争,只能靠严格的执行库的使用规则,这点即使高级程序员也容易偶尔犯错。希望在未来的标准里可以加上之类编译时检查。

  3. 还有一点就是尽量在加锁操作时使用RAII的特性,比如使用类shared_lockunique_lock来创建局部变量。这样锁定和解锁会成对执行,而不是调用shared_mutexlock(),lock_shared()unlock(),unlock_shared()方法。

例子

  1. 这里写了两个方法来对比了共享锁和排他锁的性能。很明显的,共享锁大大的提高了性能。
// test-shared-lock.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <shared_mutex>
#include <thread>
#include <string>
#include <sstream>
#include <vector>
#include <mutex>
#include <chrono>
#include <condition_variable>using namespace std;// 唯一锁
static mutex uMutex;// 读写锁
static shared_mutex rwMutex;
static string gData;static mutex rMutex;
static stringstream rData;
static condition_variable rCond;static int gAccumulate;static chrono::steady_clock::time_point Cpp11FuncBegin()
{return chrono::steady_clock::now();
}static double Cpp11FuncEnd(chrono::steady_clock::time_point t)
{auto elapse = chrono::steady_clock::now() - t;chrono::duration<double,milli> mi = elapse;return mi.count();
}template<class T,class S>
void FuncReader(int index,S& s)
{{std::unique_lock<mutex> lock(rMutex);rCond.wait(lock);}auto tPoint = Cpp11FuncBegin();//shared_lock<shared_mutex> lock(rwMutex);T lock(s);std::string str(gData);// -- 增加这个是为了看共享锁是否能同时进入; 如果能同时进入那么执行时间大概是2000ms左右.std::this_thread::sleep_for(std::chrono::milliseconds(2000)); auto result = Cpp11FuncEnd(tPoint);std::unique_lock<mutex> myLock(rMutex);rData << "index: " << index << " Read: " << str << " Duration: " << result << "ms \n";}static void FuncWriter(int index)
{{std::unique_lock<mutex> lock(rMutex);rCond.wait(lock);}unique_lock<shared_mutex> lock(rwMutex);gData.append(to_string(gAccumulate++)).append(":");std::unique_lock<mutex> myLock(rMutex);rData << "index" << index << " Write: " << gData << "\n";}// -- 读写共享锁
static void TestReadWriteSharedData()
{cout << "======== TestReadWriteSharedData ==========" << endl;rData.clear();gData.clear();vector<thread> tasks;int i = 0;for (; i < 8; ++i) tasks.emplace_back(FuncReader<shared_lock<shared_mutex>,shared_mutex>,i,std::ref(rwMutex));for(; i < 10; ++i)tasks.emplace_back(FuncWriter,i);rCond.notify_all();for (auto& one : tasks)one.join();auto str = rData.str();cout << str << endl;
}// -- 普通的非共享锁
static void TestUniqueLock()
{cout << "======== TestUniqueLock ==========" << endl;rData.clear();rData.str("");gData = "0;";vector<thread> tasks;int i = 0;for (; i < 4; ++i) tasks.emplace_back(FuncReader<unique_lock<mutex>,mutex>,i,std::ref(uMutex));rCond.notify_all();for (auto& one : tasks)one.join();auto str = rData.str();cout << str << endl;
}int main()
{cout << "Hello World!\n";TestReadWriteSharedData();TestUniqueLock();
}

输出

Hello World!
======== TestReadWriteSharedData ==========
index9 Write: 0:
index8 Write: 0:1:
index: 1 Read: 0:1: Duration: 2005.57ms
index: 6 Read: 0:1: Duration: 2005.72ms
index: 0 Read: 0:1: Duration: 2005.57ms
index: 7 Read: 0:1: Duration: 2005.57ms
index: 2 Read: 0:1: Duration: 2005.6ms
index: 3 Read: 0:1: Duration: 2005.63ms
index: 4 Read: 0:1: Duration: 2005.64ms
index: 5 Read: 0:1: Duration: 2005.67ms======== TestUniqueLock ==========
index: 3 Read: 0; Duration: 2005.35ms
index: 2 Read: 0; Duration: 4012.66ms
index: 0 Read: 0; Duration: 6021.45ms
index: 1 Read: 0; Duration: 8031.52ms

参考

  1. std::shared_lock

  2. std::shared_mutex

  3. 多线程访问修改集合vector会冲突的两个解决方案

  4. C++实现synchronized方式的对象锁

  5. C++11语言特性和标准库

  6. C++14语言特性和标准库

http://www.dtcms.com/a/576784.html

相关文章:

  • Java大厂面试真题:Spring Boot + 微服务 + 缓存架构三轮技术拷问实录
  • 患者随访管理抖音快手微信小程序看广告流量主开源
  • 做视频资源网站有哪些内容网站浮动代码
  • c#笔记之类的继承
  • Flink 流式计算的状态之道从 Table/SQL 语义到算子状态与 TTL 精准控制
  • 嘉兴做微网站多少钱有哪些好的网站
  • ps -ef | grep redis
  • 网站开发语言有哪些网站开发的问题
  • 在 JavaScript 中, `Map` 和 `Object` 都可用于存储键值对,但设计目标、特性和适用场景有显著差异。
  • Vue 3中reactive函数如何通过Proxy实现响应式?使用时要避开哪些误区?
  • MySQL备份完全指南:mysqldump语法、高级技巧与恢复实战
  • vue递归组件-笔记
  • C++ 继承特殊场景解析:友元、静态成员与菱形继承的底层逻辑
  • Soul App AI开源播客语音合成模型SoulX-Podcast
  • GitHub 热榜项目 - 日榜(2025-11-06)
  • 智源:目标分解和路径提示的奖励学习
  • 个人可以做彩票网站吗网站做外链怎么样
  • 广州哪家网站建设公司好什么是网站架构
  • 建一个论坛网站要多少钱北京保障房建设网站
  • 企业网站建设项目实践报告全国网站开发公司
  • 资源分享网站怎么做长沙网站制作哪
  • 网站怎么使用模板佛山网站建设公司价格多少
  • 营销网站建设价格wordpress手机主题视频
  • 桂阳 网站建设成都计算机培训机构排名前十
  • 网站建设商务的术语用html5做商城网站怎么做
  • 网站登陆注册怎么做泉州有专门帮做网站的吗
  • 网站建设公司行情网站建设模板源码
  • 学校网站建设制度房产网站建设产品
  • 佛山网站建设公司3luewordpress批量修改文章内的代码
  • 做网站维护需要什么证书创可贴app海报制作网站