c++中锁定数据出现读写错误的例子

2010-4

程序出现了问题,引出了数据逻辑问题。
下面两个函数GetNextDataIndexW();和SetNextDataIndexW分别锁定,
导致了可能两个线程通过了GetNextDataIndexW();但是在SetNextDataIndexW出现数据写入错误。

这是一个典型的数据同步错误,也是一个涉及到函数封装颗粒度的问题。

BOOL CShareMem::IncreaseNextDataIndex()
{if(m_nExitSignal != 0)return FALSE;int iNextDataW = GetNextDataIndexW();if( iNextDataW < 1) return FALSE;if (iNextDataW >= m_cDataCount-1){iNextDataW = 1;}else{iNextDataW++;}ATLASSERT(iNextDataW < GetDataCount());//SetNextDataIndexW(iNextDataW);return TRUE;
}BOOL CShareMem::DecreaseNextDataIndex()//
{if (m_nExitSignal != 0)return FALSE;int iNextDataW = GetNextDataIndexW();if( iNextDataW < 1) return FALSE;if (iNextDataW <= 1){iNextDataW = m_cDataCount-1;}else{iNextDataW--;}ATLASSERT(iNextDataW>=1);SetNextDataIndexW(iNextDataW);return TRUE;
}

修改为


BOOL CShareMem::IncreaseNextDataIndex()
{ATLASSERT (0 < m_cDataSize && 0 < m_cDataCount);if (0 >= m_cDataCount || 0 >= m_cDataSize)//{CUtil::Instance()->DbgFilePrintf(L"Client",_T("CShareMem::IncreaseNextDataIndex datasize incorrect!!!"));return FALSE;}if(m_nExitSignal != 0)return FALSE;if(!Lock()) return FALSE;int iNextDataW = 0;try{if (m_nExitSignal != 0){Unlock();return FALSE;}ATLASSERT(m_lpvData != NULL);if (m_lpvData != NULL){iNextDataW = *((LONG*)m_lpvData);ATLASSERT(iNextDataW >= 1 && iNextDataW < GetDataCount());if(iNextDataW < 1 || iNextDataW >= GetDataCount())iNextDataW = 0;if (iNextDataW >= m_cDataCount-1){iNextDataW = 1;}else{iNextDataW++;}ATLASSERT(iNextDataW < GetDataCount());//memcpy((LONG*)m_lpvData,(LONG*)(&iNextDataW),sizeof(LONG));}}catch(...){CUtil::Instance()->DbgFilePrintf(L"Client",L"CShareMem::IncreaseNextDataIndex() encounter a error.");}Unlock();return TRUE;
}BOOL CShareMem::DecreaseNextDataIndex()//
{ATLASSERT (0 < m_cDataSize && 0 < m_cDataCount);if (0 >= m_cDataCount || 0 >= m_cDataSize)//{CUtil::Instance()->DbgFilePrintf(L"Client",_T("CShareMem::IncreaseNextDataIndex datasize incorrect!!!"));return FALSE;}if(m_nExitSignal != 0)return FALSE;if(!Lock()) return FALSE;int iNextDataW = 0;try{if (m_nExitSignal != 0){Unlock();return FALSE;}ATLASSERT(m_lpvData != NULL);if (m_lpvData != NULL){iNextDataW = *((LONG*)m_lpvData);ATLASSERT(iNextDataW >= 1 && iNextDataW < GetDataCount());if(iNextDataW < 1 || iNextDataW >= GetDataCount())iNextDataW = 0;if (iNextDataW <= 1){iNextDataW = m_cDataCount-1;}else{iNextDataW--;}ATLASSERT(iNextDataW>=1 && iNextDataW < GetDataCount());//memcpy((LONG*)m_lpvData,(LONG*)(&iNextDataW),sizeof(LONG));}}catch(...){CUtil::Instance()->DbgFilePrintf(L"Client",L"CShareMem::DecreaseNextDataIndex() encounter a error.");}Unlock();return TRUE;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 中的一些重要函数

show create table user_profile 查看表结构 1.datediff(end_date,start_date)函数&#xff0c;now(), curdate() curtime() date_add(日期,interval num 时间) date_format(日期,格式) 4.select IFNULL(null,0); oracle 中nvl 函数 5.select IF(2 > 1, 2,0)&#xff…

c++: 缺省参数/默认参数的详解及其应用

c缺省参数/默认参数的详解及其应用 缺省参数是什么 #include<iostream> using namespace std;void func(int a 666) {cout << "a " << a << endl; } int main() {func(); //没有传参func(10); //传参return 0; }缺省参数就是在我们不进…

计算机体系结构:VLIW

原文来自知乎 计算机体系结构&#xff1a;VLIW 本文主要介绍计算机体系结构中的VLIW&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;计算机杂记 &#x1f…

腾讯云服务器99元一年购买入口链接

腾讯云服务器99元一年购买入口链接如下&#xff0c;现在已经降价到61元一年&#xff0c;官方活动链接如下&#xff1a; 腾讯云99元服务器一年购买页面腾讯云活动汇聚了腾讯云最新的促销打折、优惠折扣等信息&#xff0c;你在这里可以找到云服务器、域名、数据库、小程序等等多种…

【uniapp】小程序自定义一个通用的返回按钮组件

左边箭头&#xff0c;右边文字可以自定义&#xff0c;但是不要太长&#xff0c;太长可以自己改 .back的width值&#xff0c;改宽一点。 用这个组件的时候首先要在pages.json里把导航栏变成自定义的&#xff1a; ,{"path" : "pages/test/test","style&…

C#常识篇(三)

内置类型字节大小 以下是 C# 中常见内置数据类型的字节大小&#xff1a; bool&#xff08;布尔&#xff09;类型&#xff1a;通常为 4 或者 8 字节。在不同平台上可能会有所不同。 byte&#xff08;无符号字节&#xff09;类型&#xff1a;始终为 1 字节。 sbyte&#xff08;有…

Goose:Golang中的数据库迁移工具

Goose&#xff1a;Golang中的数据库迁移工具 在Golang开发中&#xff0c;数据库迁移是一个常见的任务&#xff0c;用于管理数据库模式的演化和版本控制。Goose是一个轻量级的、易于使用的数据库迁移工具&#xff0c;专为Golang开发者设计。本文将介绍Goose的基本概念、用法和优…

智能驾驶规划控制理论学习01-自动驾驶系统介绍、规划控制模块介绍

目录 一、自动驾驶系统概述 二、规划控制模块介绍 1、规划控制架构 2、规划控制目标 3、Cartesian和Frenet坐标系 4、Frenet坐标系概览 5、解耦式规划和联合式规划 一、自动驾驶系统概述 目前被国内外广为接受的自动驾驶级别划分标准是 SAE&#xff…

Nano 33 BLE Sense Rev2学习第二节——手机蓝牙接收数据

Nano 33 BLE Sense Rev2需要下载的程序 #include <ArduinoBLE.h> #include "Arduino_BMI270_BMM150.h"float x, y, z; int degreesX 0; int degreesY 0;BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service// cre…

2024年两会-区块链方向-新质生产力-先进制造业集群

区块链寒冬还未散去&#xff0c;但区块链引发的信任革命&#xff0c;对生产关系的变革&#xff0c;对数字金融产生的广泛影响&#xff0c;对货币金融体系的完全重构&#xff0c;对数据融合和隐私安全带来的巨大冲击才刚刚开始&#xff0c;没有不好的技术&#xff0c;只有不好的…

XSS漏洞--概念、类型、实战--分析与详解[结合靶场pikachu]

目录 一、XSS概念简述 1、XSS简介&#xff1a; 2、XSS基本原理&#xff1a; 3、XSS攻击流程&#xff1a; 4、XSS漏洞危害&#xff1a; 二、XSS类型&#xff1a; 1、反射型XSS&#xff1a; 2、存储型XSS&#xff1a; 3、DOM型XSS&#xff1a; 三、靶场漏洞复现(pikach…

LVS四层负载均衡集群

简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导的开源负载均衡项目&#xff0c;目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案&#xff0c;终端互联网用户从外部访…

基于 Guava 的 RateLimiter 实现预热功能

基于 Guava 的 RateLimiter 实现预热功能 Guava 的 RateLimiter 类提供了一种限流的机制&#xff0c;它可以控制在给定的时间间隔内允许的操作速率。虽然 Guava 的 RateLimiter 类本身并没有提供预热模型的功能&#xff0c;但是你可以通过自定义的方式实现一个简单的预热模型。…

html地铁跑酷

下面是一个简单的HTML代码来展示一个地铁跑酷游戏&#xff1a; <!DOCTYPE html> <html> <head><title>地铁跑酷</title><style>#player {position: absolute;top: 0;left: 0;width: 50px;height: 50px;background-color: red;}</style…

C语言 通讯录项目动态版本 容量可增加

项目在clion通过简单测试 代码在三个文件里写成 ①main.c 项目大框架 #include"game.h"//显示菜单 void Menu(){printf("****1.添加用户 2.删除用户****\n");printf("****3.查找用户 4.修改用户****\n");printf("****5.显示用户 6.…

diffusion model (扩散模型)原理

扩散模型分为正向过程和反向过程。 正向过程为一点点在图片上添加噪声的过程&#xff0c;反向过程为去噪声的过程。 图片的生成就是反向过程&#xff0c;给一张高斯噪声图片&#xff0c;逐步去噪生成图片。 扩散模型和VAE的区别&#xff0c; VAE是一步到位的&#xff08;通过…

一个基于差异同步数据库结构的工具 - Skeema

本文是 GO 三方库推荐的第 5 篇&#xff0c;继续介绍数据库 schema 同步工具&#xff0c;我前面已经写了两篇这个主题的文章。系列查看&#xff1a;Golang 三方库。 今天&#xff0c;推荐是的一个基于差异实现数据库 schema 迁移的工具库 - skeema&#xff0c;同样由 Go 实现。…

数字孪生10个技术栈:数据采集的八种方式

大家好&#xff0c;我是贝格前端工场&#xff0c;上期讲了数字孪生10个技术栈&#xff08;总括&#xff09;:概念扫盲和总体介绍&#xff0c;获得了大家的热捧&#xff0c;本期继续分享技术栈&#xff0c;大家如有数字孪生或者数据可视化的需求&#xff0c;可以联络我们。 一、…

迁移数据库

如果您需要快速迁移数据库到另一台服务器上&#xff0c;并且考虑到大型数据库的情况&#xff0c;以下是一些建议&#xff1a; 使用 mysqldump 导出并通过管道传输&#xff1a; 在导出时通过管道直接传输数据到新服务器&#xff0c;可以避免在中间产生大型的备份文件。这可以通过…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…