自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 预处理器

在编译器把程序换换成目标代码之前,先由C预处理器处理源文件:C源代码——>预处理器——>编译器#include 包含一个文本文件的内容#undef 取消之前定义的某个宏#define 定义宏#if 如果条件满足,执行指定动作#ifdef 如果已经定义了某个宏,执行指定动作#ifndef 如果没有定义某个宏,执行指定动作#else 如果先前的#if、#ifdef或#i

2011-03-19 20:15:00 315

原创 浮点数

 int main(int argc, char* argv[]){ float a=1.0f; cout cout cout  float b=0.0f; cout cout cout  return 0;} 输出:10x0012FF7C106535321600x0012FF780 int(&a)是将a的

2011-03-10 20:16:00 407

原创 转帖:select()和fd_set

select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于 fd_set类型通过下面四个宏来操作:    fd_set set;    FD_ZERO(&set);       /* 将set清零使集合中不含任何fd*/    FD_SET

2011-03-04 15:23:00 258

原创 线程局部存储

 线程局部存储(TLS) 机制可以为进程中所有线程关联若干个数据。各个线程通过TLS分配的全局索引来访问与自己关联的数据。Windows会为系统中的每一个进程维护一个位数组,再为该进程中的每一个线程申请同样长度的数组空间。位数组的成员是一个值为FREE或INUSE的标志,指示了此标志对应的数组索引是否在使用中。主线程调用TlsAlloc函数为线程局部存储分配索引,分配的索引值应当保存在全局

2011-03-01 16:10:00 308

原创 互斥内核对象

 使用互斥对象的方法在等待线程的可调度性商同使用其他几种内核对象的方法也有所不同。其他内核对象在没有得到通知时,受调用等待函数的作用,线程将会挂起,同时失去可调度性;而使用互斥方法却可以在等待的同时仍具有可调度性。

2011-03-01 14:56:00 329

原创 信号量内核对象

 信号量内核对象允许多个线程在同一时刻访问同一资源,但要限制在同一时刻访问此资源的最大线程数目。因此在用CreateSemaphore函数创建信号量时,要指出允许的最大资源计数和当前可用资源计数。线程在处理完共享资源后,应在离开时使用ReleaseSemaphore函数将当前可用资源计数加1。

2011-02-28 21:45:00 358

原创 事件对象

事件对象主要用于线程间通信,它是一个内核对象,因此可以跨进程使用。它包含三个成员:nUsageCount(使用计数)bSignaled(是否受信)bManualReset(是否人工重置):自动重置的事件对象受信后,Windows仅允许一个等待在该事件上的线程变成可调度状态;人工重置的事件对象受信后,所有等待在该事件上的线程都变成可调度状态。事件对象建立后,可以通过SetEvent和

2011-02-28 20:16:00 295

原创 互锁函数

 互锁函数为同步访问多线程共享变量提供了一个简单的机制,如果变量在共享内存,不同进程的线程也可以使用此机制。用于互锁的函数主要有:InterlockedDecrement(LONG volatile* Addend); //指向要递减的变量。InterlockedIncrement(LONG volatile* Addend); //将指定的32位变量加1,这个函数可以阻止其他线程同时使用

2011-02-28 18:57:00 557

原创 临界区对象

 临界区对象是定义在数据段中的一个CRITICAL_SECTION结构。Windows内部使用这个结构记录一些信息,确保在同一时间只有一个线程访问该数据段中的数据。在任何线程使用此临界区对象之前要对它进行初始化:void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);之后,线程要访问临界区中的数据,必须先

2011-02-28 18:48:00 533

原创 WaitForMultipleObjects

 WaitForMultipleObjects(DWORD nCount, //要等待的内核对象数CONST HANDLE *lpHandles, //要等待的句柄数组BOOL bWaitAll, //TRUE:等待的内核对象全变成受信状态,否则只要有一个内核对象变成受信状态,函数就返回DWORD dwMillisenconds

2011-02-28 15:10:00 284

原创 线程的终止

ExitThread函数可以当前线程的运行,促使系统释放掉所有此线程使用的资源,但C/C++资源却不能得到正确地清除。所以结束进程最好的方法是让线程函数自然返回。TerminateThread函数可以强制终止另一个线程的运行,但系统不会释放被结束线程使用的堆栈。ExitProcess函数结束进程,这时系统也会结束进程中所有线程的运行。这种方法相当于对每个线程使用TerminateThrea

2011-02-28 15:00:00 241

原创 线程内核对象

 线程内核对象是包含了线程状态信息的数据结构,基本成员如下:线程上下文:每个线程都有自己的一组CPU寄存器,称为线程上下文,反映了该线程上次云新时CPU寄存器的状态。使用计数暂停计数:指明线程的暂停计数。在调用CreateThread函数时,线程的暂停计数会初始化为1(处于暂停状态)。当线程完全初始化好了之后,CreateThread会检查是否传递了CREATE_SUSPEND标志,如

2011-02-28 14:52:00 352

原创 线程的创建

CreateProcess函数创建了进程,也创建了进程的主线程。一般情况下,应用程序使用主线程接受用户的输入,显示运行结果,而创建新的线程(辅助线程)来处理长时间的操作。每个线程必须拥有一个进入点函数,线程从进入点开始运行。主线程的进入点是main,如果想在进程中创建一个辅助线程,必须为该辅助线程指定一个进入点函数,这就是线程函数:DWORD WINAPI ThreadProc(LPVOID

2011-02-27 19:42:00 230

原创 终止进程

进程终止的原因可能有:1.主线程的入口函数返回2.进程中的一个线程调用了ExitProcess函数3.此进程中的所有线程都结束了4.其他进程中的线程调用了TerminateProcess函数当用户的程序入口函数返回时,启动函数会调用C/C++运行期退出函数exit,并将用户的返回值传递给它。exit函数会销毁所有全局的或静态的C++对象,然后调用系统函数ExitProcess促

2011-02-27 15:41:00 489

原创 获取系统进程

 CreateToolhelp32Snapshot用于获取系统内指定进程的快照,也可以获取被这些进程使用的堆、模块和线程的快照。HANDLE WINAPI CreateToolhelp32Snapshot(      DWORD dwFlags,            //指定“快照“中需要返回的对象      DWORD th32ProcessID //进程ID号);dwFl

2011-02-27 13:55:00 301

原创 CreateProcess

 CreateProcess函数的基本参数有:lpApplicationName:新进程将要使用的可执行文件的名称。lpCommandLine:传递给新进程的参数。当CreateProcess复制此字符串时,它首先检查字符串中的第一个单词,并假设此单词是你想要运行的可执行文件的名字。如果此可执行文件的名字中没有后缀,则会添加一个“.exe”后缀。CreateProcess函数会按以下路

2011-02-26 21:13:00 670

原创 Win32的启动过程

 操作系统调用CreateProcess函数创建进程内核对象——初始化使用计数——为新的进程创建一个虚拟地址空间,加载应用程序运行所需的代码和数据——创建主线程——调用C/C++运行期启动函数,启动代码又会调用main函数——返回CreateProcess的值系统在创建新进程时会为新进程指定一个STARTUPINFO类型的变量,进程可以调用GetStartupInfo函数来获取父进程在创建

2011-02-26 19:35:00 325

原创 进程和线程

 进程是一个正在运行的程序,它拥有自己的虚拟地址空间、代码、数据和其他系统资源,如进程创建的文件、管道、同步对象等。进程还包含了一个或多个运行在此进程内的线程。程序是一连串静态的指令,进程是一个容器,包含了一系列运行在这个程序实例上下文中的线程使用的资源。线程是进程内执行代码的独立实体。Win32进程由两个部分组成:1.进程内核对象。操作系统实用此内核对象来管理进程,并存放进程统计

2011-02-26 15:21:00 237

原创 使用计数

内核对象是进程中的资源,使用计数属性指明进程对特定内核对象的引用次数,当系统发现引用次数是0时,它就会自动关闭资源。进程在第一次创建内核对象时,系统会为进程分配内核对象资源,并将该内核对象的使用计数属性初始化为1,以后每次打开这个内核对象,系统就会将使用计数加1,关闭则减1。减到0就说明进程对这个内核对象的所有引用都已关闭,系统应该释放此内核对象资源。

2011-02-26 15:12:00 296

原创 对象句柄

内核对象的数据结构仅能够从内核模式访问,所以应用程序无法直接在内存中定位这些数据结构。应用程序必须使用API函数访问内核对象。调用函数创建内核对象时,函数会返回标识此内核对象的句柄。此句柄是一个能够被进程中任何线程使用的不透明的值,许多API函数需要以它为参数,以便系统知道要操作哪一个内核对象。如果将一个句柄值传递给其他进程中的线程,那么该线程以此句柄为参数调用相关函数时就会失败。多个进程也可

2011-02-26 15:06:00 395

原创 内核对象

 内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。它是一块内核分配的内存,只能被运行在内核模式下的代码访问。对于每一个内核对象,Windows都提供了在其上操作的API函数,这些API函数使应用程序有机会读写系统数据。内核对象和普通的数据结构间的最大区别是其内部数据结构是隐藏的,必须调用一个对象服务才能从此对象中得到数据,或是向其输入数据,而不能直接读或者改变对象内部的数

2011-02-26 15:01:00 213

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除