本篇文章主要介绍了"windows多线程编程 windows多线程编程星球(一)",主要涉及到windows多线程编程方面的内容,对于Windows 7jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分。原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这...
说了这么多,现在来具体介绍一下WaitForSingleObject和它的返回值,WaitForSingleObject需要两个参数,一个是对象的handle,一个是最大等待时间。如果在指定时间内等到一个激活的对象,那么就会返回WAIT_OBJECT_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_OBJECT_0 )
{
if (!SetConsoleCursorPosition(hOut,csbiInfo.dwCursorPosition))
{
printf("SetConsoleCursorPosition error!!!!! \r\n");
ReleaseMutex(ghMutex);
return;
}
if(!bString)
printf("%c",c[0]);
else
printf("%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只会变成未知状态,你可能能不能再进入资源变成了未知。