试验过程中调用了不少系统函数,并且涉及到一些系统级的概念,在此记录下来做为解决问题的一种方式。也许在以后的编程的过程中是否可以通过调用系统平台上的东西来完成一些任务,这仍不失为一种好的思维方式。

多线程编程时通常要考虑到进程是否已经结束,进程等待等问题。那么你需要这两个函数(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系统编程之进程同步试验的更多相关文章

  1. Windows系统编程之进程间通信

    Windows系统编程之进程间通信作者:北极星2003来源:看雪论坛(www.pediy.com)Windows 的IPC(进程间通信)机制主要是异步管道和命名管道.(至于其他的IPC方式,例如内存映 ...

  2. Windows系统编程之异步I/O和完成端口

    Windows系统编程之异步I/O和完成端口[作者]北极星2003[来源]看雪技术论坛(bbs.pediy.com) [时间]2006年7月1日 一.  同步I/O和异步I/O 在介绍这部分内容之前先 ...

  3. 编程实现Windows系统自动登录

    编程实现Windows系统自动登录 原理: 通过注册表修改实现.Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码, ...

  4. Python 编程环境搭建(Windows 系统中)

    由于大家普遍使用 Windows 系统,所以本文只介绍 Windows 系统中 Python 环境的安装. 在 Windows 中安装 Python 与安装普通软件没什么差别,下载所需版本的安装包后, ...

  5. 《Python黑帽子:黑客与渗透测试编程之道》 Windows系统提权

    环境准备: pywin32的安装在第八章的键盘记录中有,这里还需要安装wmi: 在本人的32位win7上本来是没有easy_install这个命令的,这需要安装setuptools-0.6c11.wi ...

  6. python在windows系统上创建文件

    正确方法为:open("test1.txt",'wb')或open("test1.txt",'w') 以下是网上的方法创建遇到的问题 使用Python2.7在w ...

  7. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  8. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  9. 如何用python在Windows系统下,生成UNIX格式文件

    平时测试工作中,少不了制造测试数据.最近一个项目,我就需要制造一批可在UNIX下正确读取的文件.为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是 ...

随机推荐

  1. The Great Mixing

    Sasha and Kolya decided to get drunk with Coke, again. This time they have k types of Coke. i-th typ ...

  2. angularjs控制输入框只输入数字及最多输入两位小数

    ps:示例中作用在循环中,其它的你可以按实际需求进行修改使用 <input type="text" ng-model="item.productNumber&quo ...

  3. JavaScript实现继承的几种重要范式

    一 原型链 1. 代码示例 function SuperType() { this.superProperty = true; } SuperType.prototype.getSuperValue ...

  4. PHP:json_encode 保持中文不被转为ASCII码

    echo json_encode(array('黄河之水天上来'),JSON_UNESCAPED_UNICODE);

  5. 嵌入式系统LINUX环境搭建

    Linux kernel Complier: http://supportopensource.iteye.com/blog/680483 sudo make mrproper         净化解 ...

  6. Dubbo入门之一:实例1

    原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1.   概述 Dubbo是一个分布式服务 ...

  7. Errors occurred during the build. Errors occurred during the build. Errors running builder 'JavaScript Validator' on XXX

    选择项目--右键Properties--Builders--如果有则取消第一项“JavaScript Validator”的勾. http://blog.csdn.net/error_case/art ...

  8. 转:InnoDB Log Block Structure(InnoDB日志Block结构详解)

    文章转载自等博 InnoDB Log Block Structure(InnoDB日志Block结构详解)

  9. Python No module named pkg_resources

    好记性不如烂笔头. I encountered the same ImportError today while trying to use pip. Somehow the setuptools p ...

  10. HDLM命令dlnkmgr详解之三__view

    view命令主要用于显示program information, path information, LU information, HBA port information, CHA port in ...