在上一篇博客(C语言网络通信制作(使用winscok实现网络通信)-CSDN博客)中我简单介绍了一下C语言线程函数的使用,这一次主要讲解一下线程的操作方式(以下函数均包含在windows.h 或winscok.h)
1,线程ID
线程ID是程序中每个线程的唯一标识符,每个线程在创建时都会被分配一个唯一的线程ID,我们可以通过线程ID对对应的线程进行标识和管理;
如果拒绝获取线程ID可以把
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
中的lpThreadId设成NULL,否则可以lpThreadId中填写一个DWORD指针
如
DWORD threadId;
CreateThread( NULL, 0, s, (LPVOID)cs,0, &threadId // 用于接收线程ID
);
或者在线程函数里使用GetCurrentThreadId();来获线程ID(在lpThreadId为NULL时也适用),如
DWORD WINAPI f(LPVOID s) {
DWORD threadId=GetCurrentThreadId();//获取当前线程ID
}
2,线程句柄
线程句柄用于标识和管理线程,通过线程句柄,程序可以与特定线程进行操作。
线程句柄获取:
线程句柄可以使用 OpenThread() 函数通过线程ID获取,如
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,//访问权限
FALSE,
Id//线程ID
);
访问权限(dwDesiredAccess):
THREAD_TERMINATE:终止线程的权限。 THREAD_SUSPEND_RESUME:挂起和恢复线程的权限。
THREAD_GET_CONTEXT:读取线程的上下文的权限。
THREAD_SET_CONTEXT:设置线程的上下文的权限。
THREAD_QUERY_INFORMATION:查询线程信息的权限。
THREAD_SET_INFORMATION:设置线程信息的权限。
THREAD_ALL_ACCESS:所有可用的线程访问权限。
3,函数应用
等待线程结束:
WaitForSingleObject()函数可以阻碍进程,
DWORD WaitForSingleObject(
HANDLE hHandle,//对象句柄
DWORD dwMilliseconds//超时时间
);
超时时间(dwMilliseconds):
dwMilliseconds有三种填写方法
1,"0"
不阻碍进程,一般用于直接返回线程函数是否结束,如果线程已经完成工作,返回WAIT_OBJECT_0;
如果线程还在运行,函数返回 WAIT_TIMEOUT;(返回值下同)
2,"INFINITE"
表示无限等待,直到线程函数结束;
3,常数
表示最大等待时间,在规定时间内等待线程结束,如果达到时间线程没有结束,则不做等待;
终止线程:
终止线程可以使用 TerminateThread() 函数,
BOOL TerminateThread(
HANDLE hThread,//要终止的线程的句柄
DWORD dwExitCode//线程的退出代码
);
线程的退出代码可以填“0”,强制退出线程
挂起和恢复线程:
挂起线程:
挂起线程可以使用 SuspendThread(线程句柄) 函数,用于暂停线程;
恢复线程:
ResumeThread(线程句柄) 函数可以取消线程暂停,恢复线程运行;
设置线程优先级:
线程优先级可以通过 SetThreadPriority() 函数设置
BOOL SetThreadPriority(
HANDLE hThread,//线程的句柄
int nPriority//线程优先级
);
优先级设置:
THREAD_PRIORITY_TIME_CRITICAL (+15):最高优先级 THREAD_PRIORITY_HIGHEST (+2):高于正常的优先级
THREAD_PRIORITY_ABOVE_NORMAL (+1):高于正常优先级
THREAD_PRIORITY_NORMAL (0):正常优先级,默认值
THREAD_PRIORITY_BELOW_NORMAL (-1):低于正常优先级
THREAD_PRIORITY_LOWEST (-2):低优先级
THREAD_PRIORITY_IDLE (-15):最低的优先级