在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. suds

    Suds: 是一个轻量级的SOAP客户端 pip install suds 可以访问webservice 选择公网的Webservice,http://www.webxml.com.cn/webser ...

  2. cgp的辣鸡比赛题解

    目录 cgp的gcd 题目链接 思路 代码 cgp调戏妹子 题目链接 思路 代码 cgp的序列 题目链接 思路 代码 cgp的背包 题目链接 思路 代码 cgp的gcd 题目链接 传送门 思路 首先看 ...

  3. JetBrains CLion 2019 for Mac(智能C和C++编辑器)中英文如何切换完整教程

    右键显示包内容,进入目录,contents/lib,删除resources_zh.jar,重启即可. 参考: https://blog.csdn.net/qq_45179462/article/det ...

  4. C 库函数 - strstr()

    定义 char *strstr(const char *haystack, const char *needle) 参数 haystack -- 要被检索的 C 字符串. needle -- 在 ha ...

  5. C++2.0新特性(四)——<decltype、lambda>

    一.关键字decltype 引入新关键字decltype可以让编译器找出表达式的类型,为了区别typeof,以下做一个概念区分: typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型 ...

  6. Linux压缩和解压类指令

    一.gzip / gunzip  指令 gzip 用于压缩文件,gunzip 用于解压文件. 基本语法gizp  文件 (功能描述:只能将文件压缩为*.gz文件)gunzip  文件.gz (功能描述 ...

  7. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法

    所谓Mini-batch梯度下降法就是划分训练集和测试集为等分的数个子集,比如原来有500W个样本,将其划分为5000个baby batch,每个子集中有1000个样本,然后每次对一个mini-bat ...

  8. 三大框架 之 Struts2

    目录 Struts2 Struts2简介 Struts2框架的作用 常见web层的框架 web框架特点 Struts2基本使用 Struts2执行流程 Struts2配置 struts2的加载顺序 P ...

  9. Java初级黄金体验 其二

    Java初级黄金体验 其二 引言:让我们看一下你的C盘有多少个文件和文件夹 初级 Java IO : 第一个纪念碑 小程序大致功能 让我们看一下E盘有多少个文件 上代码 最近太多的作业 代码可以无限改 ...

  10. java调用jni oci接口宕机原因排查

    调用最简单的JNI没有出错,但是涉及到OCI时就会异常退出,分析后基本确定是OCI 11g中的signal所致,参考ora-24550 signo=6 signo=11解决. 但是这个相同的so库直接 ...