導航:首頁 > 編程語言 > 侯捷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多線程程序設計相關的資料

熱點內容
不用網路載入的單機游戲有哪些 瀏覽:608
數據線插頭怎麼接頭 瀏覽:577
網路載入視頻失敗是怎麼回事 瀏覽:805
傳奇賬號在哪個文件夾里 瀏覽:346
百度app在哪裡安裝 瀏覽:587
如何設置路由器網路不斷網 瀏覽:471
傳到qq群里的文件怎麼刪除 瀏覽:861
索尼安卓71更新日誌 瀏覽:234
怎麼找手機里的垃圾app 瀏覽:540
2015藍橋杯代碼填空 瀏覽:698
安卓資料庫dbexecSQL 瀏覽:227
doc重命名文件格式 瀏覽:728
getscreen截圖工具下載 瀏覽:719
共識數據是什麼時候開始的 瀏覽:96
數碼管顯示電壓程序 瀏覽:479
資料庫文件有哪個 瀏覽:543
途強儲存在哪個文件夾 瀏覽:172
如何恢復被覆蓋文件 瀏覽:611
iphone5用哪個版本最好 瀏覽:327
extjsgrid禁用 瀏覽:426

友情鏈接