Windows系统编程之进程同步试验
试验过程中调用了不少系统函数,并且涉及到一些系统级的概念,在此记录下来做为解决问题的一种方式。也许在以后的编程的过程中是否可以通过调用系统平台上的东西来完成一些任务,这仍不失为一种好的思维方式。
多线程编程时通常要考虑到进程是否已经结束,进程等待等问题。那么你需要这两个函数(WaitForSingleObject,WaitForMultipleObjects)来帮助你判断是否进程已经结束,接下来的两个小时,我们来做一下关于这两个函数的试验。体验一下内核状态下的这些东西。
#include<iostream>
#include<Windows.h> using namespace std; DWORD WINAPI cProc(LPVOID lpParameter){
for (int i = ; i < ; i++){
cout << i << endl;
}
return ;
} int main(){ HANDLE hThread = CreateThread(, , cProc, , , );
DWORD ret = WaitForSingleObject(hThread, );
if (ret == WAIT_OBJECT_0){
cout << "线程执行结束!" << endl;
}
else if (ret == WAIT_TIMEOUT){
cout << "线程没能在指定时间内运行完!" << endl;
}
else{
cout << "对象有信号但是还不能执行!" << endl;
}
CloseHandle(hThread);
return ;
}
waitForSingleObject这个函数的返回类型为DWORD,它有三个值:
WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因
这个函数的参数就没有什么好解释的了,第一个参数就是你要判断的对象的句柄,第二个参数就是等待的时间大小,这里我设置为1ms,当我把进程函数体中的循环遍数调大一下就会出现WAIT_TIMEOUT这个返回值。这个不是固定的。不同情况下,不同电脑也不同。
waitForMultipleObjects
这个函数是用来等待多个内核对象的它的函数原型为:
DWORD WINAPI WaitForMultipleObjects(
_In_ DWORD nCount,
_In_ const HANDLE *lpHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds
);
nCount这个参数是指定被等待的对象的数目。This parameter cannot be zero.
lpHandles 这个参数还是比较好玩的,它是被等待对象的数组的地址,且这个数组里的对象可以是不同类型,这个不同类型是说都是HANDLE类型,但是可以指代不同的含义,例如lpHandles[0]一个线程的句柄,lpHandles[1]是一个互斥信号量的句柄,这都是允许的。
bWaitAll这个参数为ture时,这个函数等待所有被等待对象被激活(我觉得激活这个词不太好,原句:If this parameter is TRUE, the function returns when the state of all objects in the lpHandles array is signaled.)当为false时,只要这个数组中等待的对象中有一个被signaled,就立即返回,然后返回值是WAIT_OBJECT_0+(被signaled的对象在数组中的下标)。
这个函数的返回值,我就不多说了,我觉得翻译不好,还是在使用过程中结合WaitForMultipleObjects 来理解吧。
#include<iostream>
#include<Windows.h> using namespace std; DWORD WINAPI cProc(LPVOID lpParameter){
for (int i = ; i < ; i++){
cout << i << endl;
}
return ;
} int main(){
HANDLE hThread[];
hThread[] = CreateThread(, , cProc, , , );
hThread[] = CreateThread(, , cProc, , , );
DWORD dwRet = WaitForMultipleObjects(, hThread, true, INFINITE);
cout << dwRet - WAIT_OBJECT_0 << "执行完毕!" << endl;
return ;
}
这个函数的执行时没有问题的。
但是如果把WaitForMultipleObjects中的参数改为false,就会出现如下现象:

为什么这个1的输出会不跟“执行完毕!”在同一行呢。这其实就是一个waitForSingleObjects当其接收到一个线程结束后,另一个线程这个时候就和主线程并发执行,这个时候主线程输出了1还没有等待要输出执行完毕呢线程被阻塞,然后子线程获得处理机就会出现这种状况,下面这个更明显,都输出了执行完毕了,另一个线程还在输出。

Windows系统编程之进程同步试验的更多相关文章
- Windows系统编程之进程间通信
Windows系统编程之进程间通信作者:北极星2003来源:看雪论坛(www.pediy.com)Windows 的IPC(进程间通信)机制主要是异步管道和命名管道.(至于其他的IPC方式,例如内存映 ...
- Windows系统编程之异步I/O和完成端口
Windows系统编程之异步I/O和完成端口[作者]北极星2003[来源]看雪技术论坛(bbs.pediy.com) [时间]2006年7月1日 一. 同步I/O和异步I/O 在介绍这部分内容之前先 ...
- 编程实现Windows系统自动登录
编程实现Windows系统自动登录 原理: 通过注册表修改实现.Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码, ...
- Python 编程环境搭建(Windows 系统中)
由于大家普遍使用 Windows 系统,所以本文只介绍 Windows 系统中 Python 环境的安装. 在 Windows 中安装 Python 与安装普通软件没什么差别,下载所需版本的安装包后, ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Windows系统提权
环境准备: pywin32的安装在第八章的键盘记录中有,这里还需要安装wmi: 在本人的32位win7上本来是没有easy_install这个命令的,这需要安装setuptools-0.6c11.wi ...
- python在windows系统上创建文件
正确方法为:open("test1.txt",'wb')或open("test1.txt",'w') 以下是网上的方法创建遇到的问题 使用Python2.7在w ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- 如何用python在Windows系统下,生成UNIX格式文件
平时测试工作中,少不了制造测试数据.最近一个项目,我就需要制造一批可在UNIX下正确读取的文件.为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是 ...
随机推荐
- webpack 插件
插件可以完成更多 loader 不能完成的功能. 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定. Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方 ...
- 类和对象(12)—— this指针
首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针: ...
- Oracle查询数据表结构(字段,类型,大小,备注)
作用:想要生成整个Oracle数据库所有表结构WORD文档(数据库设计说明书) Oracle数据库字典介绍 Oracle数据字典是有表和视图组成的,存储有关数据库结构信息的一些数据库对象.数据库 ...
- JSP Servlet中的Request和Response的简单研究
本文参考了几篇文章所得,参考目录如下: 1.http://www.cnblogs.com/guangshan/p/4198418.html 2.http://www.iteye.com/problem ...
- git revert reset
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit. git reset 是把HEAD向后移动了一下,而git revert是HEAD ...
- CentOS 7.2 PowerShell下安装Azure Module
目前Linux版本的PowerShell还是Alpha版本,所以很多功能不能使用. 比如通过Powershell命令:install-module AzureRM在线安装Azure的Module.但我 ...
- navicat链接远程数据库
1.之前使用的是常规的连接方式 学习源头: https://jingyan.baidu.com/article/0aa2237573c1e688cc0d6427.html 这里的ip地址是服务器的ip ...
- 【HTML代码】访问页面时,拨打页面中的电话号码
这两天在写HTML页面今天要实现一个手机用户访问页面的时候,如果页面中有电话号码,点击可以打电话或者是发信息,之前没做过今天刚听说感觉很高大上会很难,实际上简单的让我内牛满面啊,, 小婊砸 (* ...
- linux 内存释放命令
我使用的是CentOS 6.5 ,由于卸载Solr 后发现内存占用挺多的,我想释放一下内存,就查阅了一些资料,分享给大家: 1.free -m 查看内存的使用情况,-m表示单位是兆 2.echo 1 ...
- 配置进程外Session
配置进程外Session: (1)将服务器Session信息存储在进程外 <1> 首先,开启asp.net state 服务: 控制面板 -> 程序和功能 -&g ...