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

哈尔滨网站建设培训学校深圳市住房和建设局局长级别

哈尔滨网站建设培训学校,深圳市住房和建设局局长级别,常见的网络广告形式,网站建设好还是阿里巴巴好最近要写一个多线程的并发数据库#xff0c;主要是希望使用读写锁实现库的并发访问#xff0c;同时考虑到其他平台(如Iar)没有C的读写锁#xff0c;需要操作系统提供#xff0c;就将读写锁封装起来。整个过程还是比较曲折的#xff0c;碰到了不少问题#xff0c;在此就简…        最近要写一个多线程的并发数据库主要是希望使用读写锁实现库的并发访问同时考虑到其他平台(如Iar)没有C的读写锁需要操作系统提供就将读写锁封装起来。整个过程还是比较曲折的碰到了不少问题在此就简单分析总结下并发和互斥吧。 首先先贴上一部分源代码 #include shared_mutex #include iostream #include windows.h #include synchapi.husing cegn_mutex std::shared_mutex; cegn_mutex g_cegn_mutex; void cegn_mutex_unique_lck(cegn_mutex testmutex) //独占锁写数据 {std::unique_lockcegn_mutex cegn_lock(testmutex); }void cegn_mutex_share_lck(cegn_mutex Dbmutex) //共享锁读数据 {std::shared_lockcegn_mutex cegn_lock(Dbmutex); }void cegn_mutex_unlck(cegn_mutex Dbmutex) {; //vc读写锁离开作用域自动释放 }int g_dwVal 0; void FastWriteData(int i) {while (1){cegn_mutex_unique_lck(g_cegn_mutex);g_dwVal;std::cout FastWriteData Set dwVal g_dwVal \n;Sleep(1000);cegn_mutex_unlck(g_cegn_mutex);} }void SlowWriteData(int i) {while (1){cegn_mutex_unique_lck(g_cegn_mutex);g_dwVal;std::cout SlowWriteData Set dwVal g_dwVal \n;Sleep(5000);cegn_mutex_unlck(g_cegn_mutex);} }void ReadData(int i) {while (1){cegn_mutex_share_lck(g_cegn_mutex);std::cout ReadData Get dwVal g_dwVal \n;Sleep(500);cegn_mutex_unlck(g_cegn_mutex);} }int main() {std::cout main start !! std::endl;std::thread thread1 std::thread(FastWriteData, 0);std::thread thread2 std::thread(SlowWriteData, 0);thread1.join();thread2.join();getchar();return 1; } 代码不长逻辑也挺清晰的但结果不正确 似乎就没有互斥保护因为FastWriteData和SlowWriteData中都独占了cegn_mutex_unique_lck(g_cegn_mutex); 且在while(1)中不存在释放写锁的情况那就不应该两个写线程交替出现。 如上让chatgpt分析下它认为没啥问题我尝试修改回标准读写锁接口如下 void FastWriteData(int i) {while (1){ // cegn_mutex_unique_lck(g_cegn_mutex);std::unique_lockcegn_mutex lck(g_cegn_mutex);g_dwVal;std::cout FastWriteData Set dwVal g_dwVal \n;Sleep(1000);cegn_mutex_unlck(g_cegn_mutex);} }void SlowWriteData(int i) {while (1){ // cegn_mutex_unique_lck(g_cegn_mutex);std::unique_lockcegn_mutex lck(g_cegn_mutex);g_dwVal;std::cout SlowWriteData Set dwVal g_dwVal \n;Sleep(5000);cegn_mutex_unlck(g_cegn_mutex);} } 如上代码运行就是正常了 main start !! FastWriteData Set dwVal 1 FastWriteData Set dwVal 2 FastWriteData Set dwVal 3 FastWriteData Set dwVal 4 FastWriteData Set dwVal 5 FastWriteData Set dwVal 6 FastWriteData Set dwVal 7 FastWriteData Set dwVal 8 FastWriteData Set dwVal 9 FastWriteData Set dwVal 10 FastWriteData Set dwVal 11 FastWriteData Set dwVal 12 FastWriteData Set dwVal 13 FastWriteData Set dwVal 14 现在FastWriteData就独占了互斥量导致SlowWriteData无法运行。为啥使用接口 void cegn_mutex_unique_lck(cegn_mutex testmutex)    //独占锁写数据 {     std::unique_lockcegn_mutex cegn_lock(testmutex); } 就不行了 修改成直接调用 using cegn_mutex std::shared_mutex; cegn_mutex g_cegn_mutex; void cegn_mutex_unique_lck(cegn_mutex testmutex) //独占锁写数据 { // std::unique_lockcegn_mutex cegn_lock(testmutex);std::unique_lockcegn_mutex cegn_lock(g_cegn_mutex); }还是不能正确互斥修改如下也一样 void cegn_mutex_unique_lck(cegn_mutex testmutex) //独占锁写数据 { // std::unique_lockcegn_mutex cegn_lock(testmutex);std::unique_lockstd::shared_mutex cegn_lock(g_cegn_mutex); } 经过分析问题是 void cegn_mutex_unique_lck(cegn_mutex testmutex) 函数中定义了一个互斥量cegn_lock std::unique_lockcegn_mutex cegn_lock(testmutex); 该互斥量在函数退出的时候生命周期就结束了所以自动销毁最终导致无法互斥那是在想要封装如何实现呢可以自己协议个类封装 完整的简单代码如下 #include iostream #include thread #include mutex #include windows.hclass MutexWrapper { public:MutexWrapper(std::mutex mutex) : m_mutex(mutex) {m_mutex.lock();}~MutexWrapper() {m_mutex.unlock();}private:std::mutex m_mutex; };std::mutex g_mutex_test; int g_dwVal 0;void FastWriteData(int i) {while (1) {MutexWrapper lock(g_mutex_test);g_dwVal;std::cout FastWriteData Set dwVal g_dwVal \n;Sleep(1000);} }void SlowWriteData(int i) {while (1) {MutexWrapper lock(g_mutex_test);g_dwVal;std::cout SlowWriteData Set dwVal g_dwVal \n;Sleep(3000);} }int main() {std::cout main start !! std::endl;std::thread thread1 std::thread(FastWriteData, 0);std::thread thread2 std::thread(SlowWriteData, 0);thread1.join();thread2.join();getchar();return 1; }如此运行正常了 修改下例程让两个进程都整行跑  void FastWriteData(int i) {while (1) {{MutexWrapper lock(g_mutex_test);g_dwVal;std::cout FastWriteData Set dwVal g_dwVal \n;}Sleep(1000);} }void SlowWriteData(int i) {while (1) {{MutexWrapper lock(g_mutex_test);g_dwVal;std::cout SlowWriteData Set dwVal g_dwVal \n;}Sleep(3000);} } 如上代码就基本都正常了。 当然也可以将互斥锁修改为读写锁如下 class MutexWrapper { public:MutexWrapper(std::shared_mutex mutex) : m_mutex(mutex) {m_mutex.lock();}~MutexWrapper() {m_mutex.unlock();}private:std::shared_mutex m_mutex; };std::shared_mutex g_mutex_test; 代码也运行正常了。 综上 1基于RAIIC的很多变量生命周期有限必须特别注意智能变量的生命周期。 2如果需要封装读写锁不能简单函数分装实在不行就用一个类封装吧 3要熟练掌握std::threadstd::shared_mutexstd::mutex的用法这个是变法互斥基本要求
http://www.hkea.cn/news/14288558/

相关文章:

  • 带数据库的网站模板网站建设还好做吗
  • 做推送用什么网站wordpress ftp 密码忘记
  • 我爱做衣服网站建站购物网站
  • 苏州网站建设熊掌号二级域名租用
  • 泉州专业建站淘宝网站做推广收费吗
  • 做简单网站代码seo视频教程
  • html网页制作流程dz论坛seo设置
  • 做网站项目团队口号陕西网站建设企业
  • 如何建设一个自己 的网站首页wordpress 编辑自己代码
  • 炎陵做网站西安网站建设那家好
  • 云浮市住房和城乡建设局网站网站帮企业做推广价格怎么算
  • 什么软件可以做动漫视频网站WordPress动漫源码
  • 小网站推荐自己做的网站网页错位
  • 阜阳市网站建设深度网网站建设
  • wordpress网站如何引流江苏有什么网站找工程建设人员
  • 西安哪家做网站公司好网站建设广告有哪些平台
  • 网站建设与管理以后工作方向被电商代运营骗了怎么办
  • 高端网站开发哪家好wordpress显示时间
  • 网站建设青岛公司简约装修
  • 新网站怎样做外链微信营销网站(含html源文件)免费下载
  • 企业网站提供商建设网站南沙区
  • 装修行业 网站建设济源做网站的好公司
  • 门户网站建设方案内容wordpress logo 修改
  • 17网站一起做网店官网wordpress自动内链
  • 电脑版和手机版网站怎么做的地铁公司招聘信息网站
  • 代理企业网站备案wordpress调用文章某个分类
  • 茶叶网站flash模板规划网站开发总体方案
  • 做网站开发考什么研国庆图片制作小程序
  • 网赌网站怎么做的wordpress启动页
  • 搞一个网站多少钱淘宝客做网站教程