b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

windows线程编程_windows7查看线程_windows多线程(5)

电脑杂谈  发布时间:2017-03-06 19:52:10  来源:网络整理

windows多线程_windows7查看线程_windows线程编程

说了这么多,现在来具体介绍一下WaitForSingleObject和它的返回值,WaitForSingleObject需要两个参数,一个是对象的handle,一个是最大等待时间。如果在指定时间内等到一个激活的对象,那么就会返回WAIT_OECT_0,一般来说这个返回值就意味着你该做和关键资源相关的事情。如果最大等待时间都过了还没有等到一个激活对象,那么将会返回WAIT_TIMEOUT。另外,这个函数还可以返回WAIT_ABANDONED,这个返回值会在一个拥有mutex的线程在没有释放这个mutex的使用权的情况下就终止了,那么这个mutex的状态就变成了abandoned。如果这个函数返回的是一个WAIT_FAILED,那么就是说这个函数在执行的过程中出现了某种错误。所以稍微修改一下MoveOutputToPos函数,利用Mutex替换CRITICAL_SECTION。 void MoveOutputToPos(int x,int y,char* c,bool bString){CONSOLE_SCREEN_BUFFER_INFO csbiInfo;csbiInfo.dwCursorPosition.X = x; csbiInfo.dwCursorPosition.Y = y;DWORD dStatus = WaitForSingleObject(ghMutex,1000*30); if ( dStatus == WAIT_OECT_0 ) {if (!SetConsoleCursorPosition(hOut,csbiInfo.dwCursorPosition)){printf("SetConsoleCursorPosition error!!!!! \r\n");ReleaseMutex(ghMutex);return;}if(!bString)printf("%c",c[0]);elseprintf("%s",c);ReleaseMutex(ghMutex); } else {ReleaseMutex(ghMutex); }} 最后,在main函数中应该用CloseHandle(ghMutex);来释放这个mutex对象。

【更多】这里我想扯的有两个,一个是CRITICAL_SECTION和Mutex之间的区别,第二个是Mutex这类东西是怎么实现对于资源的同步与控制的。 首先CRITICAL_SECTION是在用户模式下的一个实现,而Mutex是工作在内核模式的。这两个的主要差别就是在速度上,如果只工作和实现在用户模式,那么操作系统不需要进行上下文保存,系统调用或者中断等等,需要的指令自然就少,那么结果肯定是快。而Mutex得经历从application的代码用户模式到内核模式的转换,那么需要的工作就多了。其实用户模式和内核模式就是执行的CPU指令,为了不至于让应用程序跑着跑着就搞出了严重的系统错误,CPU一般把指令分成两种模式,特权模式和非特权模式,你可以理解为一些非常关键的指令,比如读取或改变诸如程序状态字之类控制寄存器的指令、原始I/O 指令和与内存管理相关的指令等等只能是像操作系统这样级别的总体调度者才能执行,如果谁都能执行,那么操作系统就乱了。这两个另外一个差别是Mutex是可以跨进程使用,而CRITICAL_SECTION肯定是不行的。最后一个我觉得重要的是如果拥有Mutex的线程非法的结束了,那么其状态会变成abandoned状态,这个时候你用WaitForSingleObject依然可以取得这个锁并且做一些工作,而CRITICAL_SECTION只会变成未知状态,你可能能不能再进入资源变成了未知。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-36136-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...