1._beginthread()
假如成功,函数将会返回一个新线程的句柄(HANDLE是void *类型)
HANDLE hd =_beginthread(CheckKey, 0, NULL)
- 新线程的起始地址 ,指向新线程调用的函数的起始地址
- 新线程的栈大小,可以为0
- 传递给线程的参数列表,无参数时为NULL
2.CreateThread()
函数返回值:
成功返回新线程的句柄,失败返回NULL。
HANDLE thread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
CloseHandle(thread); //关闭线程
- 第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置
- 第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)
- 第三个参数传递了一个函数的地址,也是我们要制定的新线程。
- 第四个参数是传给新线程的参数指针。
- 第五个参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
- 第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
3.WaitForSingleObject()
函数功能:WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到 WaitForSingleObject有返回值才执行后面的代码。此外,当dwMilliseconds设置为特殊值0时,测试hHandle核心对象是否被激发,函数立即返回。
函数原形:
DWORD WINAPI WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
第一个参数为要等待的内核对象。
第二个参数为最长等待的时间,以毫秒为单位,如传入5000就表示5秒,传入0就立即返回,传入INFINITE表示无限等待。
因为线程的句柄在线程运行时是未触发的,线程结束运行,句柄处于触发状态。所以可以用WaitForSingleObject()来等待一个线程结束运行。
函数返回值:在指定的时间内对象被触发,函数返回WAIT_OBJECT_0。超过最长等待时间对象仍未被触发返回WAIT_TIMEOUT。传入参数有错误将返回WAIT_FAILED
4.WaitForMultipleObjects()
函数原形:
DWORD WaitForMultipleObjects(
DWORD nCount,
CONST HANDLE *lpHandles,
BOOL fWaitAll,
DWORD dwMilliseconds
);
- nCount 句柄的数量 最大值为MAXIMUM_WAIT_OBJECTS(64)
- HANDLE 句柄数组的指针。
- HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组
- BOOL fWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效在往下执行,FALSE 当有其中一个信号量有效时就向下执行 (表示如果为true,则表示所有的IpHandles都必须激发,此函数才得以返回,否则,此函数将在任何一个IpHandle激发时就返回。)
- DWORD dwMilliseconds 第四个参数表示超时也返回,可为0,立即返回,INFINITE表示无穷等待,如果没有信号量就会在这死等。
5.CreateEvent()
CreatEvent():创建一个事件对象
SetEvent():把指定事件对象的状态设置为发信号状态(激发事件)
ResetEvent():把指定事件对象的状态设置为不发信号状态