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

多线程编程时通常要考虑到进程是否已经结束,进程等待等问题。那么你需要这两个函数(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. Tomcat反带和集群

    Nginx|Apache反带用户请求到Tomcat LNMT: client -->http --> nginx --> reverse_proxy --> http --&g ...

  2. 【转】Flash AS3 保存图片到本地

    核心提示:如果你想保存从视频,图表或表格中获取的图片数据到本地,可以使用BitmapData类.   原文地址:   http://www.adobe.com/cfusion/communityeng ...

  3. Common 通用类库

    /// <summary> /// 传入虚拟路径 返回全路径的html字符串 /// </summary> /// <param name="context&q ...

  4. HDU5469(树的dfs)

    Antonidas Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. Spring中的线程池ThreadPoolTaskExecutor介绍

    前言: Java SE 5.0引入了ThreadPoolExecutor.ScheduledThreadPoolExecutor.Spring 2.x借助ConcurrentTaskExecutor和 ...

  6. 第15届浙江省赛 D Sequence Swapping(dp)

    Sequence Swapping Time Limit: 1 Second      Memory Limit: 65536 KB BaoBao has just found a strange s ...

  7. Rails 表单总结

    1.button <%= button_to "删除",{:controller =>"welcome",:action =>"de ...

  8. redux使用教程详细介绍

    本文介绍redux的使用 安装 cnpm install redux --save cnpm install react-redux --save cnpm install redux-devtool ...

  9. UML关系说明文档

    http://blog.csdn.net/suxinpingtao51/article/details/8011335/

  10. Spring MVC F5刷新问题

    转自:https://bbs.csdn.net/topics/390771056 post操作成功后重定向到B,这样浏览器里F5的时候就不会让提交A了