1、 程序是计算机指令的集合
2、 进程:通常定义为一个正在运行的程序的实例。进程是资源申请、调度和独立运行的单位。进程从不执行任何东西,它只是线程的容器。要使进程完成某项操作,它必须拥有一个在它环境中运行的线程。
3、 每个进程至少拥有一个线程,来执行进程的地址空间的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,成为主线程,(即执行main或winmain的线程),此后该线程可以创建其他的线程。
4、 系统赋予每个进程独立的虚拟地址空间,对于32位进程,这个地址空间是4GB。每个进程有它自己的私有地址空间。
5、 线程由两部分组成:线程内核对象:操作系统用它对线程实施管理,也是系统用来存放线程统计信息的地方;线程堆栈:用于维护线程在执行代码时需要的所有参数和局部变量。
6、 当创建线程时,系统创建一个线程内核对象,可以讲线程内核对象视为有关于线程的统计信息组成的一个小型数据结构。
7、 线程总是在某个进程环境中创建,新线程可以访问进程的内核的对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈,这使得耽搁进程中的对个线程能够相互的通信。
8、 操作系统为每个运行线程安排一定的CPU时间即时间片。
9、 能建立多线程的尽量避免创建多进程程序。理由:多进程程序开销大,要为每个进程分配独立的4GB的内存空间,在进程间进行切换的时候要交换4GB的内存空间,执行效率低。而多线程是共享进程的内存空间,而求线程间的切换也快。
下面创建多线程实例。
由于要调用windows的api函数,所以包含windows.h
1、 首先要创建线程。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,//创建线程的入口函数
LPVOID lpParameter,//为线程函数传递参数
DWORD dwCreationFlags,//如果被标记为CREATE_SUSPENDED
LPDWORD lpThreadId
);
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
2、 创建完线程后要及时关闭线程句柄,释放线程内核引用计数。
CloseHandle();
注意:在调用多线程时避免调用同一个全局变量。因此要做线程间的同步。
用到互斥对象:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,//null使用默认的安全性
BOOL bInitialOwner,//if true,调用互斥对象的线程拥有互斥对象 的所有权
LPCTSTR lpName//null,使用没有名字的互斥对象
);
请求互斥对象:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);//当互斥对象为有信号状态,则不等待;;
互斥对象包含一个使用数量、一个线程ID,和一个计数器。谁用有互斥对象线程ID就设为当前线程的ID
得到互斥对象后要释放互斥对象:
BOOL ReleaseMutex(
HANDLE hMutex
);//当一个线程不用有互斥对象后其他线程可以拥有互斥对象,谁拥有互斥对象 就由谁来释放互斥对象
聊天程序:
BOOL AfxSocketInit( WSADATA* lpwsaData = NULL ); |
初始化套接字initSocket()//自己写的函数
这里将创