怎么实现互斥机制?
举例:程序是这样。
int i=0;
void a()
{
i++;
}
void b()
{
i--;
}
怎么在执行a的时候不让b执行,有什么好的办法。
我想的方式是用一个bool变量来做。
int i=0;
BOOL do=FALSE;
void a()
{
while do{
sleep(10);
}
do=TRUE;
i++;
do=FALSE;
}
void b()
{
while do{
sleep(10);
}
do=TRUE;
i--;
do=FALSE;
}
/////////////////////////////////////////
可是我听说好像有一种关键区技术是专门来解决这种问题的.谁来讲解一下;
最后,忽然想到一个问题,如果是进程之间,怎么来确保同步问题.:)谢谢了!
问题点数:30、回复次数:9Top
1 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 09:02:17 得分 2
同步!
参考:
http://www.vckbase.net/document/viewdoc/?id=758Top
2 楼iicup(双杯献酒)回复于 2004-12-03 09:10:18 得分 3
只有线程才存在同步问题。
函数不存在这个问题。
在函数里这样做,
要么
(1)没有用处
要么
(2)导致死锁。Top
3 楼lzzqqq(Jonersen)回复于 2004-12-03 09:17:31 得分 3
CSingleLock
CMultiLock
这几个类都行。
好象还有一种内核方式的加一操作,叫什么想不起来了。。Top
4 楼poplau(和你聊聊软件开发)回复于 2004-12-03 11:47:03 得分 0
//////////////////我查了关键区的资料/////不知道能不能行哈,我贴出来
int i=0;
CRITICAL_SECTION cr;
程序开始
{
InitializeCriticalSection(&cr);
}
void a()
{
EnterCriticalSection(&cr);//自动等待并获得权限
i++;
LeaveCriticalSection(&cr);//离开操作权限
}
void b()
{
EnterCriticalSection(&cr);
i--;
LeaveCriticalSection(&cr);
}
程序结束
{
DeleteCriticalSection(&cr);
}Top
5 楼barsteng(barsteng)回复于 2004-12-03 12:14:46 得分 3
临界区CriticalSection
互斥Mutex
事件Event
都可以Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-03 12:54:35 得分 3
进程之间可以用临界区,互斥,事件,信号量等来同步Top
7 楼lzzqqq(Jonersen)回复于 2004-12-03 14:58:11 得分 5
Jeffrey Richter大牛推荐用互锁函数家簇里的:
InterlockedExchangeAdd(&i,1);
来代替你的i++就行了。
这个函数是用原子操作方式对i进行增加.
而且是“用户方式”的线程同步方式。
比起“内核方式”的线程同步技术来高效得多。
Top
8 楼HunterForPig(留着口水的猪)回复于 2004-12-03 15:16:05 得分 8
用mutex
mutex.lock
i++
mutex.unlock
mutex.lock
i++
mutex.unlock
Top
9 楼jia20003(『gloomy fish』兄弟们一个一个结婚刺激我想跳楼!)回复于 2004-12-03 17:51:46 得分 3
将用到的flag定义为关键资源,用mutex或者是临界段先取得再访问~~~~~Top




