通过测试一信号量,发现并不是所有等待的线程在发现信号有时立刻都激发,可能是cpu把时间给别的线程了 但他还是能维持同步,大家谈谈你们在多线程中semaphore使用上的经验

解决方案 »

  1.   

    semaphore用来表示资源的数量,一个线程获得了一个semaphore,其他线程就不能获得了。同一个现成的不同地方去获得,每次获得都要消耗一个资源。mutex是互斥对象,用来作不同线程的互斥。同一个线程里面尝试获得两次,不会造成资源的短少,也就是说,如果第一次获得了mutex,在释放之前,第二次尝试获得,将会成功。这一点和 semaphore是不一样的。============================================================================
    http://www.betajin.com/alphasun/index.htm           给我发信息请附带原帖地址
    http://alphasun.18en.com/                    http://shakingtoolkit.9126.com/
    DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
      

  2.   

    semaphore用来表示资源的数量,一个线程获得了一个semaphore,其他线程就不能获得了。
    ??????????
    线程通过wait函数去请求由一个semaphore保护的资源,如果semaphore的资源记数(resource count)>0,则线程变成可调度的(schedulable),且资源记数减1;如果=0,线程就处于等待状态。
      

  3.   

    semhandle = CreateSemaphore(NULL,2,2,"mysemaph");//主线程中建立
    刚开始有两个,然后用完,之后WaitForSingleObject(semahandle,INFINITE);当然这些都是在不同的线程中完成的,问题就在与我WaitForSingleObject的时候,有一个线程ReleaseSemaphore(semahandle,1,NULL)了,这时候有信号了,也有等待的线程,但那个等待的线程并没有马上被激活,而是过了一段时间(很小很小,)后才被激活,在这个时间内,刚才ReleaseSemaphore的线程继续运行,然后才是激活的线程运行,所以我认为有信号了,等待的线程并不是“马上,立刻”进行激活的,分析有可能是cpu把时间给别的线程了 不过在大问题上他还是能维持同步的,大家多谈谈
      

  4.   

    顺便问一下大家,要用_beginthreadex()开启线程,我怎么同不过,我原来没有用过这个函数,在vc的环境下要怎么设置呢?我知道这是c_runtime的函数,但我一用就要出错,SETTING中设置Multithreaded都不行,是不是还要包含什么文件,我现在这里没有msdn,查不了
      

  5.   

    在一个时刻,只会有一个线程处在运行状态,占用处理机资源。你的那个线程ReleaseSemaphore后,只有当这个线程时间片到后,处理机调度程序才后重新调度,所以只有等待线程(此时处于唤醒状态)重新被调度到后,才会开始进入运行态,所以有一段时间(很小很小,)建议读读操作系统关于线程调度的内容。线程唤醒,阻塞,运行状态切换等
      

  6.   

    看来单独用信号,是不能满足绝对的同步的,还是Jeffrey Richter的Optex类写得好,大师就是大师
      

  7.   

    1. 一个 CPU 在同一时间只能执行一个线程,ReleaseSemaphore 时当前线程在执行(占用CPU),系统在 ReleaseSemaphore 后并不立即强制当前执行线程放弃占用 CPU ,通常需要等待执行线程用完目前的时间片。2. 一个线程从等待到唤醒需要切换 CPU 的上下文,将线程从内核态切换到用户态,引用 Richet 的说法,x86 上这需要大概 1000 个 CPU 周期
      

  8.   

    ArthurTu(猫王)  说的没错,如果没有剩余资源,其它线程才不能获得。当然如果没有剩余资源,本线程在企图获得,也无法获得了。
      

  9.   

    to yongdu:
              谢谢
     to In355Hz:
              说得不错,书上是这样说的,原来自己一直在这方面没有实践过,也谢谢你哈 大家关于线程同步还有什么自己的经验吗?说出来给大家分享好吗? 加分