导航:首页 > 编程语言 > 侯捷win32多线程程序设计

侯捷win32多线程程序设计

发布时间:2023-05-25 16:03:55

㈠ 我想学习编程需要购买那些书籍

书籍整理如下:

C++开发

1.《C++ Primer》:全面学习C++的必备书籍

2.《Thinking in C++》:了解C++背后的一些机制

3.《深度探索C++对象模型》:深入了解C++,也是学习COM的必经之路


Windows平台

入门

1.《Windows程序设计》:这本书主要讲的是Windows API的使用,是Windows编程入门书籍。上册涉及到的知识基本上就够用了,时间不充裕的话阅读上册即可。

2.《Win32多线程程序设计》:Windows下多线程编程必备

3.《Windows核心编程》:Window平台基础知识:消息机制,内存管理,多线程,动态链接库等

4.《Windows网络编程》:介绍Windows下各种网络协议的开发和并发处理模型。


进阶

1.《深入浅出MFC》:Windows下编程,MFC虽然有些过时,但其机制还是有学习的价值。重点学习书中提到的MFC 6大机制

2.《COM本质论》:COM是Windows构建用户态的重要技术之一,Windows开发必修课,本书对COM的设计动机作了深入阐述

3.《深入解析ATL》:ATL全名Active Templete Library,是用C++的模版封装了COM,这本书主要讲的是对源码分析

4.《WTL White Paper》:WTL源自微软,基于ATL的一套开源模版库,主要用于界面编程和工具类的使用

5.《代码大全》:这边书主要讲的是工程编码规范


高级

1.《深入解析Windows操作系统》:Windows大牛书籍,讲的主要是Windows操作系统的内核原理

调试技术

1.《软件调试》

2.《Windows高级调试》

3.《windows用户态程序高效排错》

Linux平台

Linux内核

1.《Linux Kernel Development》/《Linux内核设计与实现》:Robert Love的著作,不厚的一本书,深入浅出地将Linux内核娓娓道来

Linux使用和Shell编程

1.《sed & awk》/《sed与awk》:sed与awk都是Linux下常用的日志分析利器

Linux编程

1.《Beginning Linux Programming》/《Linux程序设计》:老牌的Linux编程入门书

2.《Advanced Programming in the Unix Environment》/《Unix环境高级编程》:对Unix编程环境做了细致的总结,涵盖了进程间通讯、网络通讯、文件系统等各方面的知识

网络编程

1.《TCP/IP Illustrated, Volume I》/《TCP/IP详解,卷一》:对理解TCP/IP协议的设计理念和协议细节有显著的帮助。

2.《Unix Network Programming》/《Unix网络编程》,卷一、卷二:网络编程方面难以逾越的著作,事无巨细、深入浅出,强烈推荐

对这些书目抱有100%的信心,全部掌握,融会贯通,即可打通奇经八脉,天下无双。

对了,你没有基础最好从c与c++基础开始。找些基础书开始看。

[C语言入门经典(第四版)].(美)霍顿.扫描版,《C++ Primer》就不错。

㈡ 我想学习编程应该先学什么

随着软件技术的发展,软件编程语言走过了一个由原始社会向工业社会发展的过程,从机器码编程到汇编语言,从汇编语言到各种高级语言;编程思想由面向过程发展到面向对象;同时编程工具也变成了可视化的。编程门槛随着技术和工具的发展变得越来越低,现在用delphi,vb等工具很快就可以做一个数据库系统、媒体播放器等在过去足以傲人的软件。但我要说,不要为你能在几分钟之内做一个软件而沾沾自喜,更不要因为工具的先进就丢掉了程序员的基本橘启功。不管你是在校的大学生,还是自学的爱好者,如果想在程序员这条路上走的更远,一定要学好计算机的专业课。

二、语言的选择不重要,编程思想才是根本

经常在论坛里看到初学者问,“学什么语言好?什么语言最吃香,最有前途?”,早几年,还有许多比较各种语言和编译器的文章。这种思想也深深的影响了我,使我走了许多弯路。所以我要说,选择什么语言不是最重要的,编程思想才是程序员要学的根本。各种语言发展到今天都有它存在的原因。比如现在各种高信伍颂级语言都有各自的优点,delphi最让人称道的是他在编写数据库系统方面的便捷,c/c++则在于它的灵活和高效性,vb的优点在于他最方便入门,Java的跨平台性是最好的。对于初学者学什么都好,因为这一阶段学习的重点在于语言和编译器本身,毕竟书上的例子和一个实用的工程相差是在太远。

当你走过了这个阶段,语言已经不是困扰你的重要问题时,那么你选在一个平台吧。(当然我的建议是Windows,一方面是学习的资料比较多,另一方面就是使用的人也多,好的软件是不愁每人使用的。)了解在这个平台编程的方法,就Windows来说就是学习API函数,并逐渐深入到它的内核。

如果你走过了这一阶段,那我告诉你你已经是最初你佩服的那种高手了。在这个平台上能够游刃有余,无论是开发各种应用软件,还是开发深入系统的系统软件,你都会得心应手。

三、编程不是单纯的对技术的追求,软件的灵魂是服务

作为技术人员,往往比较单纯和执著,一心想着怎么学好技术,不要落后于他人。殊不知,自己完全背离了软件的宗旨,软件(包括一切技术)的产生都是为了更好的为人服务。用户是不会在意你是否使用了更先进的技术,他只关心你是否为他提供了完整的解决方案和便捷的服务。所以在写程序前,一定要调查一下,你所写的软件会有多少用户,他们想让你提供那些服务。

以上是整体的思路,在此我以Windows平台上的学习为例,说一说学习之路。

首先以你的个人爱好或工作方向,选择一门语言。一般来说,只需要这几方面的书就够了。一种是语言入门和开发工具使用的书,之后是语言的参考大全,最后一种就是编程指南或开发指南。如学习vb,按顺序应该看《vb开发指南》《vb中文版参考祥解》(清华大学出版社);学习c/c++,则看《C语言程序设计(第二版)》(谭诰强)或《C++程序设计》(钱能),《Visual C++技术内幕(第4版)》(潘爱民),

然后看些计算机专业课程和深入Windows编程的书。如:《编码的奥秘》(Charles Petzold),《数据结构》(严蔚敏吴伟民),《滑郑编译原理和技术》,《Windows程序设计》(Charles Petzold),《深入浅出MFC(第2版)》(侯捷),《Win32多线程程序设计》(侯捷),《Windows核心编程》(jeffrey Richter)。

最后就是些深入系统内核源码和设计模式方面的书。如:《莱昂氏UNIX源代码分析》(John Lions著,尤晋元译),《STL源码剖析》(侯捷),《计算机程序设计艺术》(苏运霖译),《设计模式》( Erich Gamma等著,李英军等译)。

㈢ c语言_beginthreadex()函数不会用,求实例,纯c实现的,谢谢

//sipvoiplink.h

classSIPVoIPLink

{

private:

staticunsigned__stdcallReceivingThrd(void*pParam);

}//sipvoiplink.cpp

#include<Winsock2.h>
#include<process.h>

boolSIPVoIPLink::init()

{

......

HANDLEhThread;
unsignedthreadID;

hThread=(HANDLE)_beginthreadex(NULL,0,&SIPVoIPLink::ReceivingThrd,(LPVOID)this,0,&threadID);

if(hThread==NULL)
returnfalse;

}

unsigned__stdcallSIPVoIPLink::ReceivingThrd(void*pParam)
{
//getEvent();
((SIPVoIPLink*)pParam)->getEvent();
return0;
}

一个线程的好例子:http://www.cppblog.com/mzty/archive/2007/07/25/28756.html

引申阅读:
关于_beginthreadex和CreateThread的区别


在Win32API中,创建线程的基本函数是CreateThread,而_beginthread(ex)是
C++运行库的函数。为什么要有两个呢?因为C++运行库里面有一些函数使用了全局
量,如果使用CreateThread的情况下使用这些C++运行库的函数,就会出陪凳闹现不安全
的问题。而_beginthreadex为这些全局变量做了处理,使得每个线程都有一份独立
的芦罩“全局”量。

所以,如果你的编程只调用Win32API/SDK,就放心用CreateThread;如果要用到
C++运行时间库,那么就要使用_beginthreadex,并且需要在编译环境中选择Use
MultiThreadLib/DLL。

C++运行期库有两个创建线程的函数,另一个是_beginthread,它们两者的区别请
自己去看MSDN:

通常他们的解释都是这容易造成内存泄漏。这个解释本身是没有错的,但是解释得不够完全和详细。以至于造成很多新手盲目的信任了那句话,在那里都是用_beginthreadex函数,或者是装作没有看到使用CreateThread函数。曾经有一段时间我也对这个问题很是困惑,不知道到底用那个才是对的。因为我不止一次在很多权威性的代码中看到对CreateThread函数的直接调用。难道是权威错了??抱着怀疑的态度查粗者找了大量的资料和书籍,终于搞明白了这个问题的关键所在,在此做个说明,算是对那句话的一个完善。关于_beginthreadex和CreateThread的区别我就不做说明了,这个很容易找到的。我们只要知道一个问题:_beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函数,_beginthreadex内部调用了CreateThread。只所以所有的书都强调内存泄漏的问题是因为_beginthreadex函数在创建线程的时候分配了一个堆结构并和线程本身关联起来,我们把这个结构叫做tiddata结构,是通过线程本地存储器TLS于线程本身关联起来。我们传入的线程入口函数就保存在这个结构中。tiddata的作用除了保存线程函数入口地址之外,还有一个重要的作用就是:C运行时库中有些函数需要通过这个结构来保存和获取一些数据,比如说errno之类的线程全局变量。这点才是最重要的。

当一个线程调用一个要求tiddata结构的运行时库函数的时候,将发生下面的情况:

运行时库函数试图TlsGetvalue获取线程数据块的地址,如果没有获取到,函数就会现场分配一个tiddata结构,并且和线程相关联,于是问题出现了,如果不通过_endthreadex函数来终结线程的话,这个结构将不会被撤销,内存泄漏就会出现了。但通常情况下,我们都不推荐使用_endthreadex函数来结束线程,因为里面包含了ExitThread调用。找到了内存泄漏的具体原因,我们可以这样说:只要在创建的线程里面不使用一些要求tiddata结构的运行时库函数,我们的内存时安全的。所以,前面说的那句话应该这样说才完善:

“绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”这个需要tiddata结构的函数有点麻烦了,在侯捷的《win32多线程程序设计》一书中这样说到:

”如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的Cruntimelibrary,并使用_beginthreadex和_endthreadex:

1使用malloc()和free(),或是new和delete

2使用stdio.h或io.h里面声明的任何函数

3使用浮点变量或浮点运算函数

4调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()

㈣ 有什么关于Windows API(C++/C的)和MFC方面的好书,推荐几本

现在不流行了,书都是老书了。 Windows编程类Windows 程序设计(第5版)(上、下册)
原书名: Programming Windows (Fifth Edition)
原出版社:Microsoft Press
作者:(美)Charles Petzold
译者:北京博彦科技发展有限责任公司
出版社:北京大学出版社
出版日期:2001-03
页码:1376
定价:160:00RMB此书被认为是Windows编程最好的导论性读本。在1994年5月,此书乎粗的作者Charles Petzold被《Window Magazine》和Microsoft公司授予”Windows Pioneer”奖,以表彰他对Microsoft Windows的成功作出的贡献,可见该书的权威性,以至于“如卜顷悔果对Windows开发有什么问题的话,请翻阅PetZold的著作吧”几乎成了一句至理名言。
本书覆盖了WINDOWS编程的方方面面,将windows编程的每一个元素(如输入,输出及对话框,图形,多媒体,线程,文档与视图,Internet等等)讲解得很清晰、简明,采用的大多是具有代表性的示例,代码风格好并且很有实用价值。笔者认为这本书是学习WINDOWS编程的经典入门好书,每一次的细心阅读都会对WINDOWS编程有更深刻的理解, 不过笔者认为书中讲的内容都较为基础,更深层的东西可以去看《WINDOWS核心编程》。
笔者建议有条件的读者,最好阅读英文原版。Windows核心编程
原书名: Programming Applications for Microsoft Windows Fourth Editio
原出版社:Microsoft Press
作者:(美)Jeffrey Richter
译者:王建华等
出版社:机械工业出版社
出版日期:2000-05
页码:689
定价:86:00RMBJeffrey Richter 是 Windows System 程序设计的头头,他的每一本书都对 Windows 核心有很精彩的剖析,笔者从《Windows 95 程式设计指南》,《Windows高级编程指南》,《Windows核心编程》到《Applied Microsoft .NET Framework Programming(影印版)》一直阅读他写的书,可以说本本经典,阿蒙是他的崇拜者,死心踏地地追随Jeffrey Richter。
本书是讲解Windows 操型正作系统内部机制的专著,作者从基本概念入手,全面系统地介绍了Windows的各种基本构件,如进程、线程、DLL和内存管理等,并列举了大量应用程序,精辟地分析了构件的使用方法,为掌握Windows 编程技巧提供了一条有效的捷径。笔者写过两年的windows驱动程序, 本书的内存管理章节给我提供了很大的帮助,可见本书对内存管理讲得非常地透彻。另外本书对进程和线程的讲解也十分地经典,先说明其来龙去脉,然后描述其中的工作机制,并详细说明windows提供了哪些API函数来进行多进程与多线程的程序设计,如果能结合侯捷老师的《Win32多线程程序设计》一起研究的话,那你对进程与线程的理解将更有深度。Win32 多线程程序设计
作者:侯俊杰(侯捷)
出版社:华中科技大学出版社
出版日期:2002-01
页码:480
定价:59 .80RMB

使用线程,你可以产生高效率的服务器,建立Internet服务器扩充软件,获得多CPU系统的好处,建立精巧的COM/OLE对象,并改善程序的反应度。
本书的第一篇“上路吧,线程”,为你建立必要的基础,包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途。第二篇“多线程程序设计的工具与策略”,介绍C runtime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行多线程、如何产生一个DLL、如何对多线程程序调试。第三篇“真实世界中的多线程应用程序”,谈论如何组织一个程序,使它有效支持多线程。本篇示范两个真实世界中的应用软件,第一个是个freethreaded OLE automation server,第二个是 ISAPI程序,是个IIS(Internet Information Server)扩充软件,示范如何和JET数据库交谈。
本书从理论到实际应用讲得很全面及易懂,范例程序也很丰富并且具体生动,而且书里不时地在一些需要注意的地方给出一些总结性的建议,这不仅让读者倍感亲切,而且也加深了对所学内容的理解。

MFC编程类MFC Windows程序设计(第2版)
原书名: Programming Windows with MFC Second Edition
原出版社:Microsoft Press
作者:(美)Jeff Prosise
译者:北京博彦科技发展有限公司
出版社:清华大学出版社
出版日期:2001-09
页码:1166
定价:128:00RMB本书不仅扩展了已被认为是权威的关于Microsoft 用于windows API的功能强大的C++类库的阐述,还新增了有关COM,OLE和ActiveX等内容。本书的作者,Jeff Prosise,用其无与伦比的技巧向读者讲述了MFC程序设计中的基本概念和主要技术-再次阐释了在32位windows平台上进行快速的面向对象开发的完美方法。
笔者认为本书讲解细致而且全面,比较适合初学者,
深入浅出MFC(第二版)
作者:侯俊杰(侯捷)
出版社:华中科技大学出版社
出版日期:2001-01
页码:736
定价:80:00RMB 有关这本书及其作者,不用我多说,大家已非常清楚,网上也是众说纷坛。
本书分为四大篇。第一篇讲SDK编程,简单明了的概括了SDK程序设计的主要原理,提供进入MFC核心技术以及应用技术之前的所有技术基础,特别是Windows的消息机制,讲得很清楚。第二篇介绍Visual C++整合环境开发工具,对整个软体开发环境有全盘以及概观性的介绍,可以让初学者迅速了解手上掌握的工具,以及它们的主要功能。第三篇介绍application framework的观念,以及MFC骨干程序,所谓骨干程序,是指Visual C++的工具AppWizard所产生出来的程序码。根据我的了解,太多人使用 MFC 是编写程序只是知其然而不知其所以然,本篇详细解释 MFC 程式之来龙去脉,为初入 MFC 领域的读者奠定扎实的基础。第四篇以微软公司附于Visual C++光碟片上的一个范例程序Scribble为主轴,一步一步加上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic Creation、Persistence(Serialization)、Message Mapping、Command Routing等核心技术。这些技术正是其他书籍最缺乏的部分。
“初学者只需掌握它的精髓,而不需深究它的全部内容,否则很有可能你会看不懂,等你在不断学习过程中,返过来重复学习,你将会发现此书的奥秘所在”。COM编程类COM原理与应用
作者:潘爱民
出版社:清华大学出版社
出版日期:2001-03
页码:472
定价:39:00RMB本书不仅介绍了COM的基本原理及其扩展知识,还讲述了MTS及COM+的一些知识。全书分为三部分,第一部分为COM基础,作者在写这部分内容时,参阅了“Inside COM”一书,但对内容结构进行了重新调整,并增加了一些关于WINDOWS程序设计和MFC方面的知识;第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。读者在学习了COM的基本原理之后,结合MTS和COM+所倡导的一些概念,就可以从更高的层次来理解和使用COM及COM+了。
对于COM初学者来说这是一本经典的书, 它由浅到深的论述使你对COM的概念及框架有较深的理解。COM本质论
原书名:Essential COM
作者:(美)Box,D.
译者:潘爱民
出版社:中国电力出版社
出版日期:2001-08
页码:358
定价:49:00RMB本书由具有鬼才之称的Don Box撰写,在计算机界,“没有人能把COM阐释得比Don Box更清楚”;
本书无疑是COM领域中最负有盛名的一本书。在亚马逊的排行榜上曾盘踞数月之久,很多专家给其以极高的评价。读完这本书之后,COM对于您会“变得再明白不过了”(这是“Inside OLE”的作者Kraig Brockschmidt和本书的作者DonBox在顿悟了COM和OLE之后的境界)。期望您会有这样的感受。
本书揭示了COM(组件对象模型)的本质,旨在帮助开发人员真正理解COM的为什么,而不仅限于怎么使用。书中还提供了一个完整的分布式COM应用,演示了各种编程技术。此外,本书还涉及到许多COM高级特性,例如线程模型(或者套间模型)、名字对象、连接点等,因此,要想从本书获得最大受益,您也需要有COM的知识作基础,建议读者先阅读《COM原理与应用》之后再阅读本书。
“ 这不是一本供新手学习的书,也不是一本教您如何开发COM组件的书,而是一本在一定的基础上继续提高对COM的理解的书。如果用它来学习COM,您可能会失望,因为许多内容需要有一定的经验基础才能看得明白;但是如果用它来加深自己对COM的理解,那么这本书再合适不过了。”

㈤ Windows下编程需要看哪些书

猿绦蛏杓朴雀行巳ぃ鋈巳衔癢indows编程需要有以下基础:1、C语言
这方面不用说清华大学谭浩强的《C语言程序设计》。
2、C++语言最好是《Essentil C++》、《C++primer》、《C++编程思想》、《insideC++》、《Effectc++》循序渐进。
有了这两方面的基础可以进入Windows程序设计领域了。
Windows程序设计的三本经典的书籍:
这三本书按照由易到难的顺序依次为:<<Windows程序设计最经典的Windows编程入门书,涉及到Windows编程最基础的方方面面,书内源程序都是Win32程序,条理很清楚,可以了解进行Windows设计的一般步骤。
<<windows核心编程是讲解Windows
操作系统内部机制的专著,全面系统地介绍了Windows的各种基本构件,如进程、线程、DLL和内存管理等。
<<Programming Server Side
Application(英文版),
Windows编程的终极之作,同<<windows核心编程一样,都是JeffreyRichter的著作,讲解了
windows Server
方面的编程,包括IO完成端口方法,
Service等。如果说读第一本书可以使你完成一些简单的Windows编程,第二本书可以使你成为比较专业的Windows程序设计者,那么最后这本书将使你成为大师级的Windows程序开发者。”windows下多线程编程再推荐《Win32多线程程序设计》,

㈥ 怎样成为Windows平台下的开发高手

作为一名程序员,选择Windows作为自己的开发平台无疑是一个正确的选择。但是,由于Windows开发人员数量的庞大,使得Windows开发人员的“价值”显得普遍没有Linux,Max等平台下的高。换句换说,就说庸庸碌碌之辈太多。从一个某某培训机构学上几个月的.net的人就自称是Windows开发高手了,这当然会让人笑掉大牙。其次由于Microsoft的开发平台和工具通常很容易入手,所以使得许多程序员误以为这就是开发Windows应用,认为Windows开发理应简单。 作为一名学生,我从自己的角度谈谈如何真正成为一名Windows开发高手。注意,以下说讲的都是在自己的语言关已过的前提下,你应该熟练结构化程序设计,对面向对象程序设计有一定的理解。为什么不是精通面向对象?面向对象这潭水真的太深了,做了一辈子开发的程序员也许都不敢说自己完全掌握了面向对象程序设计精髓。 1>熟练掌握Windows SDK编程 掌握Windows SDK开发其实是对WIndows操作系统进行一次初步的探究。虽然MFC已经将SDK进行了很好的封装,但是想要真正掌握Windows程序设计的精髓,还是要从SDK开始。如果初学者一开始就拿着一本《深入浅出MFC》来看的话,我相信是看不下去的。从C语言控制台编程跨向Windows程序设计其实是需要花一点功夫的。初学者往往在学习Windows程序设计时第一个不习惯的地方是大量MicroSoft定义的宏和结构体。这些“旁枝”往往成为初学者的一大障碍,是的初学者将精力往往放在了这些不重要的地方,而不是放在Windows消息机制,窗口架构等主要的地方。MFC这一点做的更为深入,所以建议初学者一定要从Windows SDK进行学些。 推荐读物: 《Windows程序设计》------经典中的经典,Windows开发人必备读物,由微软中国的员工翻译过来的,现在已经是第五版了。 《Windows核心编程》------站在一个更高的层次审视Windows。 2>熟练掌握MFC编程 有很多人说MFC已经过时了。的确,这一点不得不承认,Windows自从将重点放在.net战略上后,基本上对传统C/C++开发这一块基本上属于放羊式管理。到现在为止都没有一套像样的界面库。那么,我们为什么还要学习MFC。 首先,学习MFC学习的是一种思想,是从Windows SDK结构化程序设计跨向面向对象程序设计的一个坚实的桥梁。虽然不能说这座桥梁有多么完美,但是历经了这么长时间的考验任然没有被淘汰,一定有它存在的价值。MFC的架构是我们必须要学习的地方,他是.net Form开发的基础。也许有很多人一开始就进行.net Form开发,C# ,VB用的很舒服,但是这仅仅是知其然不知其所以然。这样的开发者永远只是停留在表面,而不知道整个.net Form的架构是怎样的。稍微遇上一些比较复杂的问题,就束手无策了。所以MFC是必须要掌握的。 其次,MFC是直接调用Win 32API对Windows进行操作的,效率要比在虚拟机上运行的.net高很多,其次C++语言的效率也是要高于C#的。这就是为什么和图形图像有关的编程一般都会选择C++了。在高性能的某块通常都会选择C/C++进行开发,C#,VB等来调用。并且.net对传统Win32 API的调用是一度受限的。有的时候不得不用P/INVOKE的方式进行Win32 api的调用。 推荐读物:《VC++深入详解》--------孙鑫写的书,非常适合MFC的初学者。 《深入浅出MFC》---------侯捷大师对MFC做了一次完美的外科手术,读懂它,反复钻研咀嚼,你将会完全掌握MFC的精髓所在。 3>掌握Windows操作系统的核心机制 通过上面两步的学习,初学者应该已经对Windows有一定的了解了,初学者通过一种较为轻松的方式学习Windows。现在是时候对Windows进行一些深入的了解了。之前我们都是站在程序员的角度对Windows进行审视,角度可能有所单一。现在则是需要站在一名系统设计师的角度对Windows操作系统进行研究。 推荐读物:《深入解析Windows操作系统》------这本书是将带你全面的了解WIndows操作系统的各个方面 《Win32多线程程序设计》-----站在并发的角度更为深入的了解Windows机制。 读者在有了1,2的基础后学习3,相信不会有太大的难度。 4>掌握.net 作为一名Windows程序员,.net是你不得不去学习的一门技术。无论是学习还是工作你一定会遇到它。在有了以上基础的情况下,学习.net是一件十分轻松的事。.net平台下有众多语言可以选择,不过这里推荐大家首选C#,理由就不用多说了。看看每个月的编程语言排行榜就一目了然了。 推荐读物:《C#入门经典》-------Wrox公司的红宝书,讲的很全面。 《C#高级编程》--------同样是Wrox公司的书,讲的更加深入。 《C# via CLR》--------讲述.net的核心机制。 《WPF高级编程》------新一代图形界面技术,你应该了解。 5>掌握Win32 asm 人都是希望自己能越来越牛,而不是永远停留在一个初级程序员的位置。如果你想真正掌握Windows真正成为一名计算机大牛的话,汇编是你必须要掌握的。 汇编是你进行Windows下的软件调试,逆向工程,商业破解,内核研究,设备驱动开发的基础。是否精通汇编语言是普通程序员和大牛之间的一道分水岭。

㈦ 这个多线程程序为什么运行几次结果都不一样,不能总是出现我要的情况吗

呵呵,当初我学多线程时也遇到过这样的问题,也是输出的结果每次都不一样。后来我找到原因了---都是多核惹得祸。

我猜你的电脑应该也是多核的。单核的cpu在处理多线程时每次只能执行一跳指令,也就是说无论你的程序有多少个线程,每一时刻执行的也只是一个线程里的代码,cpu会轮流给每个线程分配时间片,时间片分配到哪个线程头上,哪个线程里的代码就执行。但是多核cpu就不一样了,他可以同时执行多个线程里的代码,这才是真正的“多线程”。所以你那段程序,在单核的电脑上跑应该是没有问题的,但是在多核cpu的电脑上出现的结果就会有很大的随机性。

就你贴的那张图来说,左边的运行时恰好是这样的,首先cpu1执行你主线程里的代码 在终端输出Now another thread has been created. ID =,但是由于多个cpu是同时进行的,而这时cpu2已经开始执行ThreadProc里的代码,也要开始向终端输出字符,而你的屏幕只有一个,恰好这时cpu1的时间片被移走了,所以cpu2开始执行ThreadProc里的代码向屏幕上输出,直到打完I am from a thread 17后,恰好cpu2的时间片被移走了,这时cpu1接着向屏幕打dwThreadId的值,这就出现了4660.接着又是cpu2执行完ThreadProc中剩余的代码又打了几行。

右边的这个程序运行时,恰好就是cpu1执行主线程代码输出完后,cpu2再执行线程函数中代码,符合你的预期。

但是,关键问题在于,你无法预测每个cpu的时间片分配。所以,要得到你想要的输出结果就属于随机事件了。

对与多核cpu 上的程序同步问题,最好不要用信号量,互斥量,事件对象,因为它们都属于内核对象,都是对一个cpu而言的。其他的cpu根本不会理睬你设置的这些东西。另外你的WaitForSingleObject (hThread, INFINITE); 也是在一个cpu里等待线程函数返回,对cpu2没有任何作用。

建议你用临界区(Critical Section)来实现多线程同步,因为临界区不是内核对象,他只是在进程内存中一块区域,无论有多少个cpu,任何时刻只能有一个线程访问这块内存区域,只需将你打印的部分放到临界区里就行了。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
CRITICAL_SECTION g_cs;
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
)
{
int i=0;
while (i<20)
{
EnterCriticalSection(&g_cs);
cout<<"I am from a thread"<<" "<<i++<<endl;
LeaveCriticalSection(&g_cs);

}
return 0;
}

int main(int argc, char* argv[])
{
HANDLE hThread;
DWORD dwThreadId;
InitializeCriticalSection(&g_cs);

// 创建一个线程
hThread = ::CreateThread (
NULL, // 默认安全属性
NULL, // 默认堆栈大小
ThreadProc, // 线程入口地址(执行线程的函数)
NULL, // 传给函数的参数
0, // 指定线程立即运行
&dwThreadId); // 返回线程的ID号
EnterCriticalSection(&g_cs);
cout<<"Now another thread has been created. ID ="<< dwThreadId <<"\n";
LeaveCriticalSection(&g_cs);

// 等待新线程运行结束
::WaitForSingleObject (hThread, INFINITE);
::CloseHandle (hThread);
return 0;
}

ps: kdzhy2008推荐的 侯捷 译的《win32多线程程序设计》确实是本好书,虽然是97年出版的,但是很多东西对现在还是很有启迪的。

希望对你能有所帮助,呵呵~~

阅读全文

与侯捷win32多线程程序设计相关的资料

热点内容
pc桌面壁纸文件夹 浏览:473
微信怎么添加群 浏览:781
40岁男人适合的微信名 浏览:925
编程里比例怎么打 浏览:215
苹果12两个app如何分屏 浏览:592
ps下载完不是压缩文件 浏览:362
电脑中的个人文件包括什么 浏览:572
网络连接一般什么密码 浏览:199
java定时器quartz实例 浏览:259
稻壳excel文件太大怎么弄 浏览:901
文件里的视频如何保存到相册 浏览:428
手机百度云文件电脑 浏览:957
编程怎么做到时钟精准 浏览:912
锤子用过的壁纸在哪个文件里 浏览:468
qq网站安全性未知访问不了怎么办 浏览:270
燕秀怎么修改编程人名字 浏览:789
2012年天之眼导航升级 浏览:595
如何安装视频文件 浏览:315
红米2A升级miui9 浏览:927
如何在表格中加入一行数据库 浏览:421

友情链接