WIN32多线程程序设计怎么样

WIN32多线程程序设计怎么样,第1张

虽然在编程时早就用到了多线程,也有一些多线程的知识,但是总感觉比较零碎,不够系统化。这本书恰好符合我的需要,它系统地讲述了多线程的方方面面,由主及次,由浅入深。虽然是将近十年前的一本书,现在读起来丝毫没有过时的感觉。 必须要提一句的是:侯杰老师的文笔真好,行云流水,翻译的没有任何生涩感。而且侯杰好师极其认真,对原版中出现的错误或者容易产误解的地方都做了注释。感谢作者和侯杰。

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

我猜你的电脑应该也是多核的。单核的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年出版的,但是很多东西对现在还是很有启迪的。

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

书籍整理如下:

C++开发

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

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

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》就不错。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7867980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存