原来windows也有signal
来源:互联网 发布:js each动态循环json 编辑:程序博客网 时间:2024/05/16 01:59
在windows下,信号机制简单来说是通过工作线程实现的,该线程运行于相对优先级THREAD_PRIORITY_HIGHEST,当信号产生时,windows生成该线程执行信号处理逻辑,由于该线程优先级通常主线程,也高于用户自己显式创建的任何线程,windows线程调度逻辑将阻塞其余线程的执行,直到信号处理完毕工作线程退出.
以下是测试代码
#include "stdafx.h"
#include <signal.h>
#include <windows.h>
using namespace std;
int j = 1;
void OnCtrlC(int){
cout << "ctrl + c" << endl;
cout << ::GetCurrentThreadId() << endl;
cout <<::GetThreadPriority(::GetCurrentThread()) << endl;
signal(SIGINT,OnCtrlC);
j = 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
signal(SIGINT,OnCtrlC);
int i = 0;
//::SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
while(true){
Sleep(2000);
cout << ++ i << endl;
cout << ::GetCurrentThreadId() << endl;
cout <<::GetThreadPriority(::GetCurrentThread()) << endl;
// if(j==0)
// break;
}
return 0;
}
该代码可以进行两种测试
第一种:如上,该程序运行时按下Ctrl + C后将引起 OnCtrlC函数执行,这种执行可在任何时候发生,甚至在主线程cout << 100 << endl;中仅仅输出了一个10,然后执行OnCtrlC,在然后将剩下的一个0输出.程序输出表明,OnCtrlC输出的threadid 与 main输出的threadid不同,并且OnCtrlC输出的thredid不断变化,说明改函数的线程每次都是重新创建的,OnCtrlC 调用 GetThreadPriority输出为 2,正是 THREAD_PRIORITY_HIGHEST,而main输出0,为 THREAD_PRIORITY_NORMAL.
第二种,注释掉Sleep(2000),放开main中SetThreadPriority调用,放开
if(j==0)
break;
然后运行,这次将主线程优先级调到15,高于OnCtrlC的2,因此在程序运行中按Ctrl + C将会发现程序什么反映也没有,因为主线程的高优先级阻止OnCtrlC的执行,这也是为什么放开
if(j==0)
break;
的原因,假如不放开,高速的循环代码将在你注意到OnCtrlC调用之前滚屏,既然优先级高于OnCtrlC怎么又可能OnCtrlC会被调用呢?这是由于windows动态提高线程优先级机制的作用,简单来说,就是windows注意到一个线程在3--4秒一直渴望被调度时,将被暂时将优先级提高到15,这样与main优先级相等,大家不分彼此平等竞争,在程序中产生这种情况的办法是持续不断按Ctrl + C大约3秒,程序就会退出.
tip:
只所以注释掉Sleep(2000),因为Sleep函数会将自己的Cpu时间分给其他线程.
- 原来windows也有signal
- 原来windows也有signal
- 原来windows也有signal
- 原来数据库也有"云"计算
- 原来串口也有DB-25的....
- 原来google主页也有bug
- 原来 C 里,也有bool 类型
- 原来程序员也有桃花运【爱情奇遇】
- MySQL原来也有内存数据库
- 原来你也有蛀牙啊
- 原来Linux也可以运行Windows程序
- 原来网站开发也有枯燥的地方
- struct原来也有方法,兔子很高兴
- 原来C语言也有正则表达式的库
- 原来php也有debug调试器的。
- 原来union也可以有自己的函数(方法)
- 我的c学习:原来printf也有返回值
- 原来,在Linux系统也有快速格式化功能
- 输入两个整数,求其最大公约数和最小公倍数
- window.open和window.showModalDialog用法
- 学IT 就业思路还可以再打开
- 而立,献给迷茫的同龄人!
- Google和百度网页搜索的查询参数解释
- 原来windows也有signal
- 多传感器信息融合技术在智能驾驶系统中的应用
- mootools的学习资源
- The size of system
- 50个非常有用的PHP工具
- 数据库复习
- 今年流行”靠不住“
- ASCII与字符对应表
- 求救,帮帮我