一个关于信号量的问题,有一些经验,不知道对不对,大家来谈谈 通过测试一信号量,发现并不是所有等待的线程在发现信号有时立刻都激发,可能是cpu把时间给别的线程了 但他还是能维持同步,大家谈谈你们在多线程中semaphore使用上的经验 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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词法分析 semaphore用来表示资源的数量,一个线程获得了一个semaphore,其他线程就不能获得了。??????????线程通过wait函数去请求由一个semaphore保护的资源,如果semaphore的资源记数(resource count)>0,则线程变成可调度的(schedulable),且资源记数减1;如果=0,线程就处于等待状态。 semhandle = CreateSemaphore(NULL,2,2,"mysemaph");//主线程中建立刚开始有两个,然后用完,之后WaitForSingleObject(semahandle,INFINITE);当然这些都是在不同的线程中完成的,问题就在与我WaitForSingleObject的时候,有一个线程ReleaseSemaphore(semahandle,1,NULL)了,这时候有信号了,也有等待的线程,但那个等待的线程并没有马上被激活,而是过了一段时间(很小很小,)后才被激活,在这个时间内,刚才ReleaseSemaphore的线程继续运行,然后才是激活的线程运行,所以我认为有信号了,等待的线程并不是“马上,立刻”进行激活的,分析有可能是cpu把时间给别的线程了 不过在大问题上他还是能维持同步的,大家多谈谈 顺便问一下大家,要用_beginthreadex()开启线程,我怎么同不过,我原来没有用过这个函数,在vc的环境下要怎么设置呢?我知道这是c_runtime的函数,但我一用就要出错,SETTING中设置Multithreaded都不行,是不是还要包含什么文件,我现在这里没有msdn,查不了 在一个时刻,只会有一个线程处在运行状态,占用处理机资源。你的那个线程ReleaseSemaphore后,只有当这个线程时间片到后,处理机调度程序才后重新调度,所以只有等待线程(此时处于唤醒状态)重新被调度到后,才会开始进入运行态,所以有一段时间(很小很小,)建议读读操作系统关于线程调度的内容。线程唤醒,阻塞,运行状态切换等 看来单独用信号,是不能满足绝对的同步的,还是Jeffrey Richter的Optex类写得好,大师就是大师 1. 一个 CPU 在同一时间只能执行一个线程,ReleaseSemaphore 时当前线程在执行(占用CPU),系统在 ReleaseSemaphore 后并不立即强制当前执行线程放弃占用 CPU ,通常需要等待执行线程用完目前的时间片。2. 一个线程从等待到唤醒需要切换 CPU 的上下文,将线程从内核态切换到用户态,引用 Richet 的说法,x86 上这需要大概 1000 个 CPU 周期 ArthurTu(猫王) 说的没错,如果没有剩余资源,其它线程才不能获得。当然如果没有剩余资源,本线程在企图获得,也无法获得了。 to yongdu: 谢谢 to In355Hz: 说得不错,书上是这样说的,原来自己一直在这方面没有实践过,也谢谢你哈 大家关于线程同步还有什么自己的经验吗?说出来给大家分享好吗? 加分 通过IHTMLDocument2 关联IE浏览器问题, 【如何截取CHAR* Buffer】 如何在一个对话框内结合CFileDialog和BROWSEINFO的功能 对话框消息响应数量限制问题 请教ODBC连接设置,如何设置端口,马上给分50 MSDN的问题,请大家帮忙 用PostMessage发送消息可以用lParam带一个临时变量吗的地址吗? *****关于Cursor的替换***** 神阿,救救我吧! 请问这句话怎么解? 我给了分,为什么没有显示出来 CRect(0,0,0,0)什么意思
http://www.betajin.com/alphasun/index.htm 给我发信息请附带原帖地址
http://alphasun.18en.com/ http://shakingtoolkit.9126.com/
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
??????????
线程通过wait函数去请求由一个semaphore保护的资源,如果semaphore的资源记数(resource count)>0,则线程变成可调度的(schedulable),且资源记数减1;如果=0,线程就处于等待状态。
刚开始有两个,然后用完,之后WaitForSingleObject(semahandle,INFINITE);当然这些都是在不同的线程中完成的,问题就在与我WaitForSingleObject的时候,有一个线程ReleaseSemaphore(semahandle,1,NULL)了,这时候有信号了,也有等待的线程,但那个等待的线程并没有马上被激活,而是过了一段时间(很小很小,)后才被激活,在这个时间内,刚才ReleaseSemaphore的线程继续运行,然后才是激活的线程运行,所以我认为有信号了,等待的线程并不是“马上,立刻”进行激活的,分析有可能是cpu把时间给别的线程了 不过在大问题上他还是能维持同步的,大家多谈谈
谢谢
to In355Hz:
说得不错,书上是这样说的,原来自己一直在这方面没有实践过,也谢谢你哈 大家关于线程同步还有什么自己的经验吗?说出来给大家分享好吗? 加分