社区
进程/线程/DLL
帖子详情
我想学线程 , 大家说那本书好?
abin207
2002-08-14 10:38:41
请推荐两本,一本入门级得 ,一本提高级的
谢谢
...全文
33
13
打赏
收藏
我想学线程 , 大家说那本书好?
请推荐两本,一本入门级得 ,一本提高级的 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lovesuru
2002-08-23
打赏
举报
回复
windows核心编程
有英文的教材吗?
abin207
2002-08-23
打赏
举报
回复
好的 ,就 windows核心编程
谢谢大家
wolfpzp
2002-08-22
打赏
举报
回复
up!
Yokishiro
2002-08-22
打赏
举报
回复
windows核心编程
Kendiv
2002-08-22
打赏
举报
回复
强烈建议看看《Windows核心编程》
xiaoxiaohan
2002-08-22
打赏
举报
回复
线程的基础知识
1. 进程与线程有那些区别和联系?
l 每个进程至少需要一个线程。
l 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。
l 进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。
l 如果在单进程环境中,有多个线程正在运行,那么这些线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。
l 进程使用的系统资源比线程多得多。实际上,线程只有一个内核对象和一个堆栈,保留的记录很少,因此需要很少的内存。因此始终都应该设法用增加线程来解决编程问题,避免创建新的进程。但是许多程序设计用多个进程来实现会更好些。
2. 如何使用_beginthreadex函数?
使用方法与CreateThread函数相同,只是调用参数类型需要转换。
3. 如何使用CreateThread函数?
当CreateThread被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。使用时应当注意在不需要对线程内核进行访问后调用CloseHandle函数关闭线程句柄。因为CreateThread函数中使用某些C/C++运行期库函数时会有内存泄漏,所以应当尽量避免使用。
参数 含义
lpThreadAttributes 如果传递NULL该线程使用默认安全属性。如果希望所有的子进程能够继承该线程对象的句柄,必须将它的bInheritHandle成员被初始化为TRUE。
dwStackSize 设定线程堆栈的地址空间。如果非0,函数将所有的存储器保留并分配给线程的堆栈。如果是0,CreateThread就保留一个区域,并且将链接程序嵌入.exe文件的/STACK链接程序开关信息指明的存储器容量分配给线程堆栈。
lpStartAddress 线程函数的地址。
lpParameter 传递给线程函数的参数。
dwCreationFlags 如果是0,线程创建后立即进行调度。如果是CREATE_SUSPENDED,系统对它进行初始化后暂停该线程的运行。
LpThreadId 用来存放系统分配给新线程的ID。
4. 如何终止线程的运行?
(1) 线程函数返回(最好使用这种方法)。
这是确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
•在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。
•操作系统将正确地释放线程堆栈使用的内存。
•系统将线程的退出代码设置为线程函数的返回值。
•系统将递减线程内核对象的使用计数。
(2) 调用ExitThread函数(最好不要使用这种方法)。
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消。
(3) 调用TerminateThread函数(应该避免使用这种方法)。
TerminateThread能撤消任何线程。线程的内核对象的使用计数也被递减。TerminateThread函数是异步运行的函数。如果要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数。当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。
(4) 包含线程的进程终止运行(应该避免使用这种方法)。
由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。就像从每个剩余的线程调用TerminateThread一样。这意味着正确的应用程序清除没有发生,即C++对象撤消函数没有被调用,数据没有转至磁盘等等。
一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调用GetExitcodeThread来检查由hThread标识的线程是否已经终止运行。如果它已经终止运行,则确定它的退出代码。
5. 为什么不要使用_beginthread函数和_endthread函数?
与_beginthreadex函数相比参数少,限制多。无法创建暂停的线程,无法取得线程ID。_endthread函数无参数,线程退出代码必须为0。还有_endthread函数内部关闭了线程的句柄,一旦退出将不能正确访问线程句柄。
6. 如何对进程或线程的内核进行引用?
HANDLE GetCurrentProcess( );
HANDLE GetCurrentThread( );
这两个函数都能返回调用线程的进程的伪句柄或线程内核对象的伪句柄。伪句柄只能在当前的进程或线程中使用,在其它线程或进程将不能访问。函数并不在创建进程的句柄表中创建新句柄。调用这些函数对进程或线程内核对象的使用计数没有任何影响。如果调用CloseHandle,将伪句柄作为参数来传递,那么CloseHandle就会忽略该函数的调用并返回FALSE。
DWORD GetCurrentProcessId( );
DWORD GetCurrentThreadId( );
这两个函数使得线程能够查询它的进程的唯一ID或它自己的唯一ID。
7. 如何将伪句柄转换为实句柄?
HANDLE hProcessFalse = NULL;
HANDLE hProcessTrue = NULL;
HANDLE hThreadFalse = NULL;
HANDLE hThreadTrue = NULL;
hProcessFalse = GetCurrentProcess( );
hThreadFalse = GetCurrentThread( );
取得线程实句柄:
DuplicateHandle( hProcessFalse, hThreadFalse, hProcessFalse, &hThreadTrue, 0, FALSE, DUPLICATE_SAME_ACCESS );
取得进程实句柄:
DuplicateHandle( hProcessFalse, hProcessFalse, hProcessFalse, &hProcessTrue, 0, FALSE, DUPLICATE_SAME_ACCESS );
由于DuplicateHandle会递增特定对象的使用计数,因此当完成对复制对象句柄的使用时,应该将目标句柄传递给CloseHandle,从而递减对象的使用计数。
8. 在一个进程中可创建线程的最大数是得多少?
线程的最大数取决于该系统的可用虚拟内存的大小。默认每个线程最多可拥有至多1MB大小的栈的空间。所以,至多可创建2028个线程。如果减少默认堆栈的大小,则可以创建更多的线程。
abin207
2002-08-15
打赏
举报
回复
好像那本书挺旧的,92年的
netsbull
2002-08-15
打赏
举报
回复
侯捷翻译的那本就不错了
abin207
2002-08-15
打赏
举报
回复
除了这本书呢??
GodGiven
2002-08-15
打赏
举报
回复
同意楼上
要60块银子
slattn
2002-08-15
打赏
举报
回复
侯老师的<WIN32多线程程序设计>
2ndboy
2002-08-14
打赏
举报
回复
侯捷的那本书,名字忘了
abin207
2002-08-14
打赏
举报
回复
upupupu 呵呵
算法导论(正宗中文第三版)3-1
新增了van emde boas树和多
线程
算法,并且将矩阵基础移至附录。 修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。 移除两章很少讲授的内容:二项堆和排序网络。 修订了动态规划和...
线程
和进程的区别是什么?
线程
和进程的区别是什么?
Java多
线程
学习(吐血超详细总结)
本文主要讲了java中多
线程
的使用方法、
线程
同步、
线程
数据传递、
线程
状态及相应的一些
线程
函数用法、概述等。
Java
线程
的概念:什么是
线程
?
Java
线程
的概念:什么是
线程
? 世间万物都可以同时完成很多工作。例如,人体可以同时进行呼吸、血液循环、思考问题等活动。用户既可以使用计算机听歌,也可以编写文档和发送邮件,而这些活动的完成可以同时进行。...
多
线程
还是多进程的选择及区别
鱼还是熊掌:浅谈多进程多
线程
的选择 关于多进程和多
线程
,教科书上最经典的一句话是“进程是资源分配的最小单位,
线程
是CPU调度的最小单位”,这句话应付考试...”等等期望一劳永逸的问题,我只能
说
:没有最好,只有更
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章