如何设置互斥量? HANDLE hMutex=CreateMutex(0,FALSE,"CRSERVER_MUTEX_ONCE"); ///利用互斥,防止多个程序运行,创建互斥量,FALSE 表示此互斥量现在不被任何线程所拥有.if(hMutex) { //如果hMutex互斥量存在,则这里处理. } 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没错,用临界区不过临界区在读的时候也需要进入临界区,效率不行,----------------这里楼主的意思让人费解,可能是你对临界区的理解不对吧比如一个全局变量 int g_iv;读的时候 不做同步 a = g_iv;写的时候 enter... // 进入临界区 g_iv = 1000; leave.. // 离开临界区为什么说读也要保护呢?另外,使用 临界区 比使用 mutex 要高效的多 if(x>y) x=y;这样的一句,x是需要互斥的量,被多个线程共同访问,每个线程都可能有上面的过程,比如都执行完了if那行,接着可能线程1把x赋了一个很大的值,而线程2马上又把他改写成了一个不是很大的值。 怎么帮我处理这两条语句吧if(x>y)x=y;x是全局变量。y是局部的目的是使x越来越大。不互斥可能会出现我上面说的那种情况的。有时候需要读x,怎么样能够比较的有效率 if(x>y) x=y;这样的一句,x是需要互斥的量,被多个线程共同访问,每个线程都可能有上面的过程,比如都执行完了if那行,接着可能线程1把x赋了一个很大的值,而线程2马上又把他改写成了一个不是很大的值。--------------同一时间,只能有一个线程能改这个值.这就是"临界区"和"互斥量"的作用.但你的意思好象是:需要做必须要线程1处理完成,再由线程2处理.再到线程3处理...令人费解.. 用临界区就这样EnterCriticalSection// 进入临界区if (x > y) x = y;LeveCriticalSection// 离开临界区用互斥就这样WaitForSingleObject(hMutex, INFINITE) //if (x > y) x = y;ReleaseMutex(hMutex)难道不就这个样子吗?结果会有区别?实在是很不理解LZ啊.可能有写错的词,我没查. 安全的办法还是临界区,因为你不用临界区,很难保证写的时候不被操作系统分时中断,就像数据库不用事务,很难回滚一样。如同数据库事务只把在关键代码时开始,如修改金钱数量。基本上不会影响效率。临界区是操作系统在cup硬件上实现的,比任何软件实现方法可靠。 睡不着, 百度等搜索引擎的索引如何存储的,在文件还是数据库? 很基础的问题? 小妹我用OnTimer()函数为什么只启动一次就不动了?? VC板块对CSDN意见和建议征集贴 Connection在哪查呀? 菜鸟做的客户端如何获得sql server服务器的时间?? 我编写了一个ATL控件,在win98,win2000下可以注册,但在winXP下注册时提示“LoadLibrary 失败,找不到指定模块” 关于WM_PAINT的更新问题 大侠帮忙呀:我想更改工程编译出的可执行文件和帮助文件的名称,该如何操作 如何在线程中控制窗口的控件?各位帮忙! 关于数据类型的转换 长等待函数提前返回的问题
----------------
这里楼主的意思让人费解,可能是你对临界区的理解不对吧比如一个全局变量 int g_iv;读的时候 不做同步
a = g_iv;写的时候
enter... // 进入临界区
g_iv = 1000;
leave.. // 离开临界区为什么说读也要保护呢?另外,使用 临界区 比使用 mutex 要高效的多
x=y;这样的一句,x是需要互斥的量,被多个线程共同访问,每个线程都可能有上面的过程,比如都执行完了if那行,接着可能线程1把x赋了一个很大的值,而线程2马上又把他改写成了一个不是很大的值。
if(x>y)
x=y;
x是全局变量。
y是局部的
目的是使x越来越大。
不互斥可能会出现我上面说的那种情况的。有时候需要读x,怎么样能够比较的有效率
x=y;这样的一句,x是需要互斥的量,被多个线程共同访问,每个线程都可能有上面的过程,比如都执行完了if那行,接着可能线程1把x赋了一个很大的值,而线程2马上又把他改写成了一个不是很大的值。
--------------
同一时间,只能有一个线程能改这个值.这就是"临界区"和"互斥量"的作用.
但你的意思好象是:
需要做必须要线程1处理完成,再由线程2处理.再到线程3处理...令人费解..
EnterCriticalSection// 进入临界区
if (x > y)
x = y;
LeveCriticalSection// 离开临界区用互斥就这样
WaitForSingleObject(hMutex, INFINITE) //
if (x > y)
x = y;
ReleaseMutex(hMutex)难道不就这个样子吗?结果会有区别?实在是很不理解LZ啊.
可能有写错的词,我没查.