博文
多线程同步技术-2(2006-03-11 00:17:00)
摘要:
在前面讲述线程通信时曾使用过事件内核对象来进行线程间的通信,除此之外,事件内核对象也可以通过通知操作的方式来保持线程的同步。对于前面那段使用临界区保持线程同步的代码可用事件对象的线程同步方法改写如下:
// 事件句柄
HANDLE hEvent = NULL;
// 共享资源
char g_cArray[10];
……
UINT ThreadProc12(LPVOID pParam)
{
// 等待事件置位
WaitForSingleObject(hEvent, INFINITE);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
// 处理完成后即将事件对象置位
SetEvent(hEvent);
return 0;
}
UINT ThreadProc13(LPVOID pParam)
{
// 等待事件置位
WaitForSingleObject(hEvent, INFINITE);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[10 - i - 1] = 'b';
Sleep(1);
}
// 处理完成后即将事件对象置位
SetEvent(hEvent);
return 0;
}
……
void CSample08View::OnEvent()
{
// 创建事件
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 事件置位
SetEvent(hEvent);
// 启动线程
AfxBeginThread(ThreadProc12, NULL);
AfxBeginThread(ThreadProc13, NULL);
// 等待计算完毕
Sleep(300);
// 报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}
......
多线程同步技术-1(2006-03-11 00:15:00)
摘要:
摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。
关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量;
阅读目录:
使线程同步
临界区
管理事件内核对象
信号量内核对象
互斥内核对象
小结
正文
使线程同步
在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。
如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。
为了确保读线程读取到的是经过修改的变量,就必须在向变量写入数据时禁止其他线程对其的任何访问,直至赋值过程结束后再解除对其他线程的访问限制。象这种保证线程能了解其他线程任务处理结束后的处理结果而采取的保护措施即为线程同步。
线程同步是一个非常大的话题,包括方方面面的内容。从大的方面讲,线程的同步可分用户模式的线程同步和内核对象的线程同步两大类。用户模式中线程的同步方法主要有原子访问和临界区等方法。其特点是同步速度特别快,适合于对线程运行速度有严格要求的场合。
内核对象的线程同步则主要由事件、等待定时器、信号量以及信号灯等内核对象构成。由于这种同步机制使用了内核对象,使用时必须将线程从用户模式切换到内核模式,而这种转换一般要耗费近千个CPU周期,因此同步速度较慢,但在适用性上却要远优于用户模式的线程同步方式。
临界区
临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此......
DLL(Dynamic Link Libraries)专题(2006-03-11 00:11:00)
摘要:
比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Windows自己就将一些主要的系统功能以DLL模块的形式实现。
一般来说,DLL是一种磁盘文件,以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。
在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。Windows操作系统对DLL的操作仅仅是把DLL映射到需要它的进程的虚拟地址空间里去。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有.
一、关于调用方式:
1、静态调用方式:由编译系统完成对DLL的......
决定你一生成就的21个信念(2006-03-10 21:56:00)
摘要:
1、 我是最棒的,我一定会成功。
2、 我是一切的根源,要积极地面对人生。
3、 我是我认为的我,我们是我们认为的我们。
4、 成功是因为态度。
5、 过去不等于未来。
6、 人因梦想而伟大。
7、 不是不可能,只是还没有找到方法。
8、 成功一定有方法。
9、 成功者找方法,失败者找借口。
10、 命运在自己手里(有个算命的故事、命运线抓在自己的手里),而不是在别人的嘴里。
11、 天助者自助。
12、 你越努力,你的运气就越好。
13、 我要我就能。不是能力在决定拟的成功,而是你一定要成功,决定你一定会去准备响应的能力;不是现在的方法决定你的成功,而是你一定要成功决定拟一定会找到成功的方法。
14、 决心决定成功。
15、 山不过来,我就过去。
16、 成功就是每天进步一点点。
17、 没有失败,只是暂时没有成功。
18、 只要你不服输,失败就不会是定局。
19、 坚持到底,永不放弃。
20、 人人都能成功。
21、 立即行动。......
VC++ 的串口通讯(2006-03-03 00:51:00)
摘要:
在VC++中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC++访问串口。下面将简述这两种方法。
一、Microsoft Communications Control
Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。
该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。我推荐用程序设置,这样更灵活。
SetCommPort:指定使用的串口。
GetCommPort:得到当前使用的串口。
SetSettings:指定串口的参数。一般设为默认参数"9600,N,8,1"。这样方便与其他串口进行通讯。
GetSettings:取得串口参数。
SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。
GetPortOpen:取得串口状态。
GetInBufferCount:输入缓冲区中接受到的字符数。
SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。
GetInPut:读取输入缓冲区。
GetOutBufferCount:输出缓冲区中待发送的字符数。
SetOutPut:写入输出缓冲区。
一般而言,使用上述函数和属性就可以进行串口通讯了。以下是一个范例。
#define MESSAGELENGTH 100
class CMyDialog : public CDialog
{
protected:
VARIANT InBuffer;
VARIANT OutBuffer;
CMSComm m_Com;
public:
.......
解读女人(2006-02-28 13:31:00)
摘要:
吻她吧,不够君子
不吻吧,不像汉子
夸她吧,说你撒谎
不夸吧,说你笨蛋
顺她吧,说你“妻管严”
不顺吧,不善解人
太浪漫,疑你老练
太规矩,魅力不足
常看她,招她厌烦
少去点,怨你猎艳
穿得好,说你花心
邋遢些,缺个心眼
大度点,说你不爱
求欢吧,不够尊重
安份吧,不够宠爱
你晚了,她等得烦
她晚了,女孩特权
你访友,说你堕落
她聚会,天性其乐
少亲她,你太冷淡
老亲她,你占便宜
过街不管,道德有缺陷
领着她走,男人耍手段
你看别人,是挑逗风情
别人看她,是仰慕佳人
你要说话,她让你听
洗耳恭听,她逼你开口
上帝啊!为何要造女人?
简简繁繁
弱弱强强
我晕头转向
我魂牵梦绕
“上帝啊!球你告诉我怎么办?阿门!”
......
变形金刚大事回顾(上)(2006-02-25 13:49:00)
摘要:
1100万年前
五面怪星人在一颗行星上制造工厂使其机械化并且命名为塞波特恩
五面怪星人在行星塞波特恩上生产民用机器人及战斗用机械人替他们工作
塞波特恩中央电脑魔力神球成功的制造出第三个变形金刚A-3(年轻时代的钛师傅)
以魔力神球为核心的神秘电脑装置-Oracle诞生
奴隶机器人对五面怪的残暴统治非常不满,终于爆发了并把五面怪逐出塞波特恩
塞波特恩进入黄金时代
———————————————————————————————————
900万年前
民用机器人及战斗用机器人的理念与意识形态非常不同
战斗用机器人的组织为霸天虎
民用机器人的组织为汽车人
每当汽车人的领袖毁灭的时候都会把领导模块传给新领袖
恶魔之日 威震天诞生
霸天虎利用反重力系统 获得飞行能力
奥里安.派克斯被威震天破坏,被来自未来的飞行太保所救,并由钛师傅改造成擎天柱
擎天柱领导汽车人对抗霸天虎
汽车人为对抗霸天虎学会了变形能力,霸天虎也在不久后学会变形
塞波特恩内战正式开始
-------------------------------------------------------------------
??万年前
威震天利用洗脑装置增强自军实力,大力金刚的朋友挖地虎(大力神)受害,两人从此敌对
霸天虎的科学家红蜘蛛和天火到宇宙探索,天火因为意外而不知行踪
三人的机器昆虫乘小型宇宙飞船到达太阳系并进行自我进化
-------------------------------------------------------------------
400万年前
塞波特恩因长年战争而终于濒临能源枯竭
擎天柱带领汽车人到宇宙探索新能源,途中遭到霸天虎袭击两军于太阳系第三行星坠落并进入紧急状态,一切技能停止
塞波特恩科学家为了逃避战乱而于玛斯塔行星定居
玛斯塔行星的汽车人以福特为领袖,霸天虎则由撒克率领
霸天虎的宇宙飞船暴影号失踪
威震天失踪期间,震荡波担任塞波特恩上霸天虎的指挥官
-......
Windows Media Player SDK 简介(2006-02-25 12:34:00)
摘要:摘要:了解如何更改 Windows Media Player 的外观和行为,如何将其嵌入基于 Web 或基于 Windows 的应用程序,以及如何使用插件对象扩展其功能。本文介绍了 Windows Media Player 软件开发工具包 (SDK) 并描述了这些功能的用法。
简介
Microsoft? Windows Media? Player 为数字音频和视频提供了出色的播放效果,但您的业务可能需要显示更多信息,或者需要修改视频或音频内容的播放方式。使用 Windows Media Player 软件开发工具包 (SDK)(代号为“Corona”),您可以扩展独立 Player 的功能,并将播放功能嵌入到自己的应用程序中。本文对 SDK 进行了高级概述,涉及如下所述的三个主要功能;本文适用于决策者以及初次接触数字媒体编程的程序员。
可以将 Player 嵌入 Web 应用程序或基于 Microsoft Windows? 的应用程序中。Windows Media Player 具有模块化体系结构,使您可以只使用所需的部分。尤其是,用户界面与音频和视频内容的播放功能相互独立。您可以使用其播放功能,并可决定在应用程序中是使用 Player 的现有用户界面,还是创建自己的用户界面。
Windows Media Player 提供了外观功能,您可以使用该功能创建个性化的 Player 外观,也可以基于 Player 创建截然不同的功能。
还可以创建插件来扩展 Player 的主要功能,方法是向用户界面添加新的交互式控件,在 Player 呈现音频或视频数据前对其进行修改,然后在 Windows Media 文件中呈现非标准数据流。
本文包括以下主题:
1、创建 Player 应用程序。介绍如何在 Web 或基于 Windows 的应用程序中嵌入 Windows Media Player 功能。
2、创建外观。介绍外观功能:更改 Windows Media Player 的外观和行为。
3、创建插件。介绍修改 Windows Media Player 外观和行为的插件。其中包括呈现专有内容、修改音频或视频播放以及通过交互式控件提供全新的功能。
创建 Player 应用程序
Windows ......
linux命令和基础知识(2006-02-22 23:46:00)
摘要:
Linux备份与压缩命令
tar命令
tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。
语法:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。
主选项:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
x 从档案文件中释放文件。
辅助选项:
b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
语法:gzip [选项] 压缩(解压缩)的文件名
各选项的含义:
-c 将输出写到标准输出上,并保留原有文件......
linux命令收集(2006-02-22 23:10:00)
摘要:
Linux磁盘管理
df命令
功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
语法:df [选项]
说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。
该命令各个选项的含义如下:
-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k 以k字节为单位显示。
-i 显示i节点信息,而不是磁盘块。
-t 显示各指定类型的文件系统的磁盘空间使用情况。
-x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
-T 显示文件系统类型。
du命令
du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。
功能:统计目录(或文件)所占磁盘空间的大小。
语法:du [选项] [Names…]
说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。
该命令的各个选项含义如下:
-s 对每个Names参数只给出占用的数据块总数。
-a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
-b 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。
-k 以1024字节为单位列出磁盘空间使用情况。
-c 最后再加上一个总计(系统缺省设置)。
-l 计算所有的文件大小,对硬链接文件,则计算多次。
-x 跳过在不同文件系统上的目录不予统计。
dd命令
功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。
语法:dd [选项]
if =输入文件(或设备名称)。
of =输出文件(或设备......