关于2个程序同时操作一个东西

来源:百度知道 编辑:UC知道 时间:2024/06/08 23:57:33
或许标题没说对。我不知道怎么描述。
比如修改数据库或者文件,为了保证不同的修改者修改同一个文件造成冲突
所以,在修改文件之前,会将文件锁定,保证,某个文件同一时间只有一个修改者。
那么执行顺序就是:
检测是否被锁定: ---锁定则放弃 1
---若未锁定 2
---锁定文件 3
---开始修改 4

现在就是,2个用户,同时开始修改同一个文件,由于CPU是分时(就是你走一步,我走一步的那种感觉)执行指令的,
如果a用户执行到2那步,然后开始执行b的操作,也执行到2那步
这儿就出问题了,继续执行的话a和b都会去锁文件。

不知道这种问题计算机是怎么解决的,由那一部分解决。。
上门只是一个例子,而我实际工作中遇到了这种情况
if a < 10
then a=a+1;

2个这样的代码分别被执行,如果都执行到 if a < 10
最后a就会变成11
这是和当初设定不符的

这个问题在操作系统课程当中有详细的介绍,你可以去找本操作系统的书看看

解决方式就是靠系统提供的原语, windows 提供的比方说

互斥锁 interlocked 系列函数 速度超快,功能超简单。。
关键代码段 CriticalSection 系列函数 你可以去找找 EnterCriticalSection 这个函数的msdn, 这系列函数完成你的要求应该没问题
互斥量 mutex , 这个功能也很全面, 不过经常wait个没完

可能还有些别的, 不过这些机制本质上并没什么不同(互斥锁例外),基本上上面的可以搞定一切了。

还要提醒一句,用同步机制千万小心,避免死锁

使用操作系统提供的互斥或同步访问机制,举个Windows系统中的例子:
struct somedata
{
CRITICAL_SECTION cs;
int counter;
} g_data;

///////////////////////////////////////////////

int function()
{
EnterCriticalSection(&g_data.cs);
++counter;
LeaveCriticalSection(&g_data.cs);
}
这样即使两个或多个线程同时访问counter变量也不会导致其值不可预测,因为一个线程处于关键区时,起一个线程必须等待,直到第一个线程离开关键区。

自己的代码这样写是无法完成临界资源锁定的。这个必须由操作系统提供。

你可以看看C语言中关于进程资源锁定的内容。这个内容很多,回帖估计是说不清楚的。自己去查下。

这是线程同步问题,你可以上网查下"线程同步".

修改文件都是临时创建了一个副本,只有你保存更改时才会应用到源文件,所以不会存在冲突