线程基础知识学习

来源:互联网 发布:nginx 会话粘滞 编辑:程序博客网 时间:2024/06/04 22:16

对于线程的学习,注意包含以下知识点。


1.线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。


2. CreateThread 函数在主线程的基础上创建一个新线程。
MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)

HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,//线程安全属性
DWORDdwStackSize,//堆栈大小
LPTHREAD_START_ROUTINElpStartAddress,//线程函数
LPVOIDlpParameter,//线程参数
DWORDdwCreationFlags,//线程创建属性
LPDWORDlpThreadId//线程ID
);
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
//也可以直接调用void类型
//但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如: (LPTHREAD_START_ROUTINE)MyVoid
//然后在线程声明为:
void MyVoid()
{
return;
}
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
(2)0:表示创建后立即激活。
(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈 的大小,否则,dwStackSize指定提交的大小。该标记值在Windows 2000/NT and Windows Me/98/95上不支持。
lpThreadId:保存新线程的id。
返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。
函数说明:
创建一个线程。
语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
一般并不推荐使用 CreateThread函数,而推荐使用RTL库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
在MFC程序中,应该调用AfxBeginThread函数,在Visual C++程序中应调用_beginthreadex函数。


3.CreateThread创建线程,线程函数为DWORD WINAPI ThreadProc(LPVOID lpParameter);只能传递一个参数。如果要实现多参数,可以将参数写成结构体,再传入线程函数。这个函数是一个应用程序定义的函数的占位符,作为一个线程的起始地址。在调用CreateThread函数时,指定该地址。
函数应该返回一个值,表示线程函数返回退出码,一般使用0作为返回值。线程创建成功,返回非零值,否则为0。 



4.Sleep()函数功 能: 执行挂起一段时间.Sleep()单位为毫秒,sleep()单位为秒(如果需要更精确可以用usleep单位为微秒)
返回值,若进程/线程挂起到参数所指定的时间则返回0,若有信号中断则返回剩余秒数。
void Sleep(DWORD dwMilliseconds);


5.CreateMutex()函数可用来创建一个有名或无名的互斥量对象.
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);
lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
Long,如执行成功,就返回互斥体对象的句柄;零表示出错。
一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
线程中止前,一定要调用ReleaseMutex释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃(下一个释放的等待函数会返回WAIT_ABANDONED),并自动释放所有权。


6.WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。
执行成功,返回值指示出引发函数返回的事件。



7.AfxSocketInit() 调用 CWinApp::InitInstance 中的重写函数初始化此 Windows 套接字。
BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );
lpwsaData 指向WSADATA结构的指针。如果lpwsaData不等于NULL,那么调用::WSAStartup将填充WSADATA结构。这个函数同时也保证在应用程序结束之前调用::WSACleanup。
在调用 AfxSocketInit() 之前,需要包含 afxsock.h 头文件。
如果函数成功执行,则返回非零值,否则为0。



8.在MFC的面向对象的编程中,一个程序的全局变量或全局函数如果需要封装在类中,可以定义为静态的成员函数或静态的成员变量。但非静态的不行。


9.PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。
该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。
BOOLWINAPIPostMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零,否则函数调用返回值为零



10.CIPAddressCtrl类提供Windows普通IP地址协议的功能。此控件只适用于运行在Microsoft Internet Explorer 4.0及更高版本的程序中。

CIPAddressCtrl
构造一个CIPAddressCtrl对象Create创建一个IP地址控件并将其附加给一个CIPAddressCtrl对象
属性
IsBlank
确定是否IP地址控件中的所有域都为空ClearAddress清空IP地址控件的内容GetAddress获取IP地址控件中  所有四个域的地址值SetAddress设置IP地址控件中所有四个域的地址值SetFieldFocus设置键盘焦点到IP地址控件中的指定的域SetFieldRange设置IP地址控件中指定域的范围


int GetAddress(DWORD& dwAddress);dwAddress

接收IP地址的DWORD值的地址的参考





0 0
原创粉丝点击