我用一个信号量来实现两个线程的同步,一个ReleaseSemaphore,一个WaitForSingleObject等待,而且是永久等待,结果发现ReleaseSemaphore这个线程间歇性的出现耗时15-16ms,导致性能不如人意,请高手指点原因

解决方案 »

  1.   

    WINDOWS下的信号量好像是有点问题
      

  2.   

    首先,线程是由操作系统来负责调度的,在你对信号量进行操作的这个过程中,可能会切换到系统中的其他线程,线程之间的切换会耗费一定的CPU时间,再则,信号量是系统中的核心对象,每次操作都会触及系统的核心,进入系统核心相对切换到其他用户线程要耗费更多的CPU时间,所以,楼主得到的这个时间应该是正常情况下所耗费的时间!
      

  3.   

    如果在同一个进程不同线程中对共享资源进行同步的话,建议使用临界区对象,临界区对象不是系统的核心对象,涉及他的操作不会进入系统核心,相比其他的核心同步对象(如:Mutex, Semaphore, Event...)效率要高很多!
      

  4.   

    临界区在有些情况下是会进入KERNEL模式的
    并不是一直不进入KERNEL模式而如果使用Mutext Event这些是一定会进入KERNEL模式切换。。
      

  5.   

    看错了,还以为16s呢16ms是正常的,效率本来就是低...-_-b
      

  6.   

    楼上说的都在理。
        不过我还是怀疑是否测试准确,单单一个ReleaseSemaphore不应该耗掉那么多时间,毕竟现在的CPU都是以Ghz在跑。在多线程里,如果一个信号等待或释放都要耗掉16ms,那实在是黄花菜都凉了:(
        待会我在本机上测试以后,如果时间确定很长,我继续跟贴.如果我没有跟贴,就说明时间应该可以忽略不记...
      

  7.   

    哈哈,感谢大家捧场,这个时间并非每次Release的时候都发生,间歇性,哪位有高招?
      

  8.   

    1.这个函数在我的机器上耗时为零,精度:0.1ms
    2.这说明不是这个函数本身对信号量操作延时造成的,而是你的其它线程有"死循环或死等待"强占CPU资源而造成了间歇性的阻塞.
      

  9.   

    to nlstone:
       哈哈,猛男?果然厉害,我已经解决了,问题瓶颈果然不在那里,前面我用gettickcount测试虽然有这个现象,但现在看来不是决定性因素