120 likes | 291 Views
多线程编程. 在 TCPServer 程序中使用多线程同时处理多个连接. 此时套接字工作在阻塞模式下. 将阻塞方式的 I/O 操作在单独的线程中进行,保证整个程序(进程)是非阻塞的。 使用多线程而不使用非阻塞模式的套接字,可以实现同时处理多个连接的功能。之所以仍然设计了非阻塞模式,因为多线程在编程难度和高压力情况下对系统的压力方面仍有可改进之处. CreateThread() 函数. HANDLE CreateThread( // 一个任选参数,可用来指定新线程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes,
E N D
多线程编程 在TCPServer程序中使用多线程同时处理多个连接
此时套接字工作在阻塞模式下 • 将阻塞方式的I/O操作在单独的线程中进行,保证整个程序(进程)是非阻塞的。 • 使用多线程而不使用非阻塞模式的套接字,可以实现同时处理多个连接的功能。之所以仍然设计了非阻塞模式,因为多线程在编程难度和高压力情况下对系统的压力方面仍有可改进之处
CreateThread()函数 HANDLE CreateThread( //一个任选参数,可用来指定新线程的安全属性LPSECURITY_ATTRIBUTES lpThreadAttributes, //新线程栈的大小(单位:字节) DWORD dwStackSize, //指定新线程的起始地址 LPTHREAD_START_ROUTINE lpStartAddress, //提供传递给线程的一个单一的参数值 LPVOID lpParameter, //提供控制线程创建过程的另外一些标志,缺省为NULL DWORD dwCreationFlags, //返回线程标识 LPDWORD lpThreadId );
CreateThread()的功能 • 创建新线程,新线程默认处于就绪状态。除非在dwCreationFlags中进行了特定的设置,如CREATE_SUSPENDED,新线程将处于挂起状态 • 必须设置的参数主要是lpStartAddress、 lpParameter、 lpThreadId • 例如: DWORD WINAPI Thread1(LPVOID param); HANDLE hThread; …… hThread=CreateThread(NULL,0,Thread1,hDCT,NULL,&ThreadID);
多线程在TCPServer程序中的使用 DWORD WINAPI Thread(LPVOID param); //线程函数 HANDLE hThread; //线程句柄 DWORD ThreadID; //用于取得线程标识 … … //sClient来自哪里? sClient = accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen); … … //创建新线程,以sClient为线程的参数 hThread = CreateThread(NULL,0,Thread,(LPVOID)sClient,NULL,&ThreadID); if (hThread == NULL) //若线程创建失败,显示原因 printf("%s\n",GetLastError());
多线程在TCPServer程序中的使用 DWORD WINAPI Thread(LPVOID param) { char Text[256]; int nRecv = recv((SOCKET)param, Text, strlen(Text), 0); if(nRecv > 0) { Text[nRecv] = '\0'; printf("接收到数据:%s \n", Text); } //关闭同客户端的连接 closesocket((SOCKET)param); return 1; }
常见线程调度函数 DWORD SuspendThread( HANDLE hThread ); • 挂起线程
SwitchToThread():线程切换 BOOL SwitchToThread(VOID) • 使调用者线程暂停运行,并调度另一个就绪线程开始运行
ResumeThread():恢复线程 DWORD ResumeThread( HANDLE hThread ); • 此函数用来继续运行一个已挂起的线程
ExitThread():退出线程 VOID ExitThread( DWORD dwExitCode ); • 线程可使用该函数推出,dwExitCode指定线程的终止状态
TerminateThread():终止线程 TerminateThread( HANDLE hThread, DWORD dwExitCode ); • 该函数用于终止一个线程
Sleep():线程睡眠 Sleep( DWORD dwMilliseconds ); • 该函数可使当前线程的执行延迟一个指定的时间间隔