ReleaseSemaphore竟然时不时要用掉16ms 我用一个信号量来实现两个线程的同步,一个ReleaseSemaphore,一个WaitForSingleObject等待,而且是永久等待,结果发现ReleaseSemaphore这个线程间歇性的出现耗时15-16ms,导致性能不如人意,请高手指点原因 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WINDOWS下的信号量好像是有点问题 首先,线程是由操作系统来负责调度的,在你对信号量进行操作的这个过程中,可能会切换到系统中的其他线程,线程之间的切换会耗费一定的CPU时间,再则,信号量是系统中的核心对象,每次操作都会触及系统的核心,进入系统核心相对切换到其他用户线程要耗费更多的CPU时间,所以,楼主得到的这个时间应该是正常情况下所耗费的时间! 如果在同一个进程不同线程中对共享资源进行同步的话,建议使用临界区对象,临界区对象不是系统的核心对象,涉及他的操作不会进入系统核心,相比其他的核心同步对象(如:Mutex, Semaphore, Event...)效率要高很多! 临界区在有些情况下是会进入KERNEL模式的并不是一直不进入KERNEL模式而如果使用Mutext Event这些是一定会进入KERNEL模式切换。。 看错了,还以为16s呢16ms是正常的,效率本来就是低...-_-b 楼上说的都在理。 不过我还是怀疑是否测试准确,单单一个ReleaseSemaphore不应该耗掉那么多时间,毕竟现在的CPU都是以Ghz在跑。在多线程里,如果一个信号等待或释放都要耗掉16ms,那实在是黄花菜都凉了:( 待会我在本机上测试以后,如果时间确定很长,我继续跟贴.如果我没有跟贴,就说明时间应该可以忽略不记... 哈哈,感谢大家捧场,这个时间并非每次Release的时候都发生,间歇性,哪位有高招? 1.这个函数在我的机器上耗时为零,精度:0.1ms2.这说明不是这个函数本身对信号量操作延时造成的,而是你的其它线程有"死循环或死等待"强占CPU资源而造成了间歇性的阻塞. to nlstone: 哈哈,猛男?果然厉害,我已经解决了,问题瓶颈果然不在那里,前面我用gettickcount测试虽然有这个现象,但现在看来不是决定性因素 频繁调用同一个外部控制台应用程序,能不能使只打开一次dos窗口,来提高效率? 拖动快捷方式的问题 SDI简单程序!我创建的按扭看不到 将自己程序获取到的cookie传递给用户默认浏览器 对BMP图片的操作问题,急!! 请教:如何知道一个CWnd*对应的窗口是什么类型的? 关于edit控件的问题,大家帮帮我把,看看到底是怎么回事 提醒大家注意:send 和 recv 中的标志 阿菜的问题 是蜜月?要我一个月搞定软件下载,怎么办哪? 简单问题,在线等。socket recv buffer设置多大最好。目的用做http 客户端 heapalloc? virtualalloc?
并不是一直不进入KERNEL模式而如果使用Mutext Event这些是一定会进入KERNEL模式切换。。
不过我还是怀疑是否测试准确,单单一个ReleaseSemaphore不应该耗掉那么多时间,毕竟现在的CPU都是以Ghz在跑。在多线程里,如果一个信号等待或释放都要耗掉16ms,那实在是黄花菜都凉了:(
待会我在本机上测试以后,如果时间确定很长,我继续跟贴.如果我没有跟贴,就说明时间应该可以忽略不记...
2.这说明不是这个函数本身对信号量操作延时造成的,而是你的其它线程有"死循环或死等待"强占CPU资源而造成了间歇性的阻塞.
哈哈,猛男?果然厉害,我已经解决了,问题瓶颈果然不在那里,前面我用gettickcount测试虽然有这个现象,但现在看来不是决定性因素