若干个纪录同时被修改的问题

hjd2357 2008-09-17 03:36:29
提醒:不是数据库操作。

条件:
1,有一万个数据
2,同一个数据同一时间只能被一个人修改,但是不同的数据可以同一时间被修改。
像下面的例子,数据A,B同时被人甲,人已修改,但是人丙不能和人甲同时修改数据A
数据 人甲 人已 人丙
A F 修改不可
B E

我本想用信号灯来控制,也就是说建立10000个信号灯来控制这1万个数据,
但是效率太底。
有没有别的好办法可以实现?
...全文
117 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
up起来学习!~
hjd2357 2008-09-22
  • 打赏
  • 举报
回复
czp_opensource 2008-09-18
  • 打赏
  • 举报
回复
我优先考虑,先教会人甲 人已 人丙 怎么写sql语句~
mhyx_2008 2008-09-18
  • 打赏
  • 举报
回复
mark
bgqy2000 2008-09-17
  • 打赏
  • 举报
回复
每个记录对应一个锁来控制,不过如果一个线程死的话,没办法重启电脑好了,哈哈
lann64 2008-09-17
  • 打赏
  • 举报
回复
难的还不止是加锁,window的不稳定是人人皆知的,其中一个线程要是死了,程序怎么办?
要是某次修改失误,数据如何恢复?
备份怎么控制?操作留痕怎么记录?

呵呵,自己做,难。
fibbery 2008-09-17
  • 打赏
  • 举报
回复
每一条记录都应该有一个唯一标识!

你可以构造一个唯一标识与互斥体的映射表:例如,唯一标识为记录号,用long型表示
std::map<long,CMutex> m_map_lock;

当有一条记录要被修改时,取得其记录号,并到映射表中查找,如果找到,则进入互斥体,当然,如果有人正在修改,此时是阻塞等待的;如果没有在映射表中找到该记录的互斥体,则创建互斥体。

在创建互斥体时存在一个问题,如果此时有另外一个线程也想创建互斥体怎么办,所以,为了避免同时创建互斥体,你还需要创建另一个互斥体,来同步多线程在映射表中增加和删除互斥体!具体你可以在考虑!

另外,也可以使用信号量,构造一个映射表:
std::map<long,CSemaphore> m_map_lock;
信号量的初值为1,最大值也为1。对于删除信号量时,只要其等待对象的数目为0时即可以删除,但同样涉及在添加、删除时的一个互斥操作!

如果,你的文件找不到一个唯一标识或者不容易找到或者不容易表示,那么也可以使用文件的偏移量作为标识!

我想方法会有很多种!
GoldenHunter 2008-09-17
  • 打赏
  • 举报
回复
以一个bit作为一个对应数据的锁,你有10000个数据,就需要1W个bit,对应bit置为1,
则不能修改,随机等待一会再访问,对应位置零,可以修改
这样空间小,速度快
wangdeqie 2008-09-17
  • 打赏
  • 举报
回复
触发器
K行天下 2008-09-17
  • 打赏
  • 举报
回复
挺复杂的
hai040 2008-09-17
  • 打赏
  • 举报
回复
建一个数组记录数据是否被修改,对这个数组加锁?
lann64 2008-09-17
  • 打赏
  • 举报
回复
自己写控制锁到数据级?还是在windows下实现?牛。
hjd2357 2008-09-17
  • 打赏
  • 举报
回复
补充说明:
是在windows下的实现。
不是linux下的实现
《望江楼单词连连看》是一个英语单词连连看小游戏,纯绿色免费软件,游戏开始后时会随机从词库中选出若干单词,要求玩家找出汉英对应的一对方块以消除,在不知不觉中单词已烂熟于胸了。软件小巧,无需安装,还可从U盘直接运行,使您随时随地都能边玩边记。 词库内含: 雅思、托福词汇、托福词组、GMAT、MBA、GRE、GRE必背、GRE逆序、金融英语、商务词汇、商务英语、外贸英语、计算机词汇、大学英语四六级词汇、大学词组、大学5级6级常用词组、大学英语自学教程、高教自考英语、研究生入学词汇、研究生入学词组、职称英语、新概念英语、巴朗词汇、懒人单词、太傻单词、分类词库、词根记忆法、常用前后缀。 本游戏中的词库放在Lib文件夹下,都是纯文本格式,以便您自已修改增删合并词库。其中有一个“词库列表.ini”文件,是以词库文件名(不包括扩展名)为内容的配置文件,如果你要增删词库,请在此文件中相应增减。你自已新增的外来词库应和游戏自带词库格式一样。 《望江楼单词连连看V1.31》是在经部分网友(包括程序员朋友)提供的反馈和建议下作了一些改进,希望能够满足大家的学习和娱乐。本游戏中的所有纪录都是作者本人自已打的,由于我的英语水平很一般(四级),所以成绩很差,希望不要见笑,不过四级单关的纪录还是不错的,希望你能破了。如要清空纪录,请将ScordList.ini内的内容删除即可,游戏的记时是采用取游戏起终两次系统时间之差来确定,故相当准确,不受系统性能的影响。 本小游戏由Borland公司的Delphi 7.0编制。 小灵通软件工作室(成都) 2007年2月26日

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧