在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时间分给其他线程.

【VS开发】windows下的signal的更多相关文章

  1. gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

    cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...

  2. electron之Windows下使用 html js css 开发桌面应用程序

    1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...

  3. Windows下搭建Spark+Hadoop开发环境

    Windows下搭建Spark+Hadoop开发环境需要一些工具支持. 只需要确保您的电脑已装好Java环境,那么就可以开始了. 一. 准备工作 1. 下载Hadoop2.7.1版本(写Spark和H ...

  4. windows下使用vs进行Proctocol Buffer开发(C++篇)

    因工作原因接触Proctocol Buffer(protobuf),至于什么是protobuf,为何使用protobuf,我就不赘述了,百度下都是答案. 今天我介绍的是在windows下使用vs进行p ...

  5. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  6. Windows下USB磁盘开发系列二:枚举系统中所有USB设备

    上篇 <Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘). 主要调用的API如下: 1 ...

  7. Windows下的Objective-C集成开发环境(IDE)(转)

    Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1)   使用苹果的平台,集成开发环境使用X ...

  8. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

  9. windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境

    windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境   http://rongmayisheng.com/post/windows%E4%B8%8B%E7%94%A ...

随机推荐

  1. P3388 【模板】割点(割顶)&& 桥

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  2. Xilinx ISE的时序约束

    使用Synplify Pro加时序约束.综合完毕后,可以在ISE中进行布局.布线.需要用.ucf文件指定布局布线的时钟约束.前者可以比后者小. 早期的ISE,两个约束可以继承.现在用的高版本,反而需要 ...

  3. php-fpm 参数调优

    php-fpm 进程池优化方法 php-fpm进程池开启进程有两种方式,一种是static,直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是dynamic,开始时开启一定数量的php ...

  4. 在linux中设置优先使用ipv4,而不是ipv6

    背景: 有时候更新源的时候默认使用ipv6,而ipv6下载数据时候总出现问题. 所有想默认出口的时候优先使用ipv4出口访问,而不是ipv6. 要使用ipv4 连接优先而不必禁用ipv6,需要修改ga ...

  5. Python逆向(四)—— Python内置模块dis.py源码详解

    一.前言 上一节我们对Python编译及反汇编做了讲解,大家知道dis模块可以将编译好的pyc文件中提取出来的PyCodeObject反汇编为可以阅读字节码形式.本节我们对dis模块中的源码进行详细的 ...

  6. ZR#1015

    ZR#1015 解法: 我们需要求得, $ g_i $ 表示长度为的最长不下降子序列个数. 设 $ f_{i,j} $ 表示统计第前$ i $ 个数字,得到最长不下降子序列末端为 $ j $ . 显然 ...

  7. tecplot-计算合速度的一种方法

    原视频下载地址: http://yunpan.cn/cudFwWr8tFsxV  访问密码 75a8

  8. ansys meshing当中共享节点的操作

    原视频下载地址: https://yunpan.cn/cYKuN9mIHMUxa  访问密码 5858

  9. 【软工实践】Alpha冲刺(2/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 了解了如何根据系统获取的实际情况进行后端任务的调整 网易云音乐推荐算法的分析 ...

  10. scrapy 一些坑

    scrapy爬虫出现Forbidden by robots.txt # Obey robots.txt rulesROBOTSTXT_OBEY = False scrapy定时执行抓取任务 用cron ...