几种创建线程的方法

  • CreateThread

    Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)。线程函数定义为:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。但它没有考虑:
    (1)C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常(典型的例子是strtok函数)。
    (2)MFC也需要知道新线程的创建,也需要做一些初始化工作(当然,如果没用MFC就没事了)。

  • AfxBeginThread

    MFC中线程创建的MFC函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread, 在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex(AfxBeginThread相比较更为安全)创建线程。它简化了操作或让线程能够响应消息,即可用于界面线程,也可以用于工作者线程,但要注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。线程函数定义为:UINT _yourThreadFun(LPVOID pParam)

  • _beginthreadex

    MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。 仅使用Runtime Library时,可以用_BegingThread。

CreateEvent

CreateEvent(
    __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
    __in     BOOL bManualReset,
    __in     BOOL bInitialState,
    __in_opt LPCSTR lpName
    );

bManualReset: 指定将事件对象创建成手动复原还是自动复原。
如果是TRUE, 那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。  
如果是FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。

bInitialState:指定事件对象的初始状态;  
当TRUE, 初始状态为有信号状态;  当FALSE, 初始状态为无信号状态。

SetEvent / ResetEvent

分别将EVENT置为这两种状态分别是有信号状态与无信号

WaitForSingleObject / WaitForMultipleObjects

WaitForSingleObject(
    _In_ HANDLE hHandle,
    _In_ DWORD dwMilliseconds
    );
    
参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

WaitForSingleObject 的返回值有以下三种情况:
WAIT_OBJECT_0:表示你等待的对象(比如线程、互斥体)已的正常执行完成或完成释放。
WAIT_TIMEOUT:表示你等待的对象在还没完成之前,由 WaitForSingleObject 设置的时间已经超时。
WAIT_ABANDONED:这是针对等待对象是互斥体的情况,当互斥体对象虽然没有被占用它的线程释放,但是占用它的线程已提前中止时,WaitForSingleObject 就返回此值。

WaitForSingleObject函数用来检测 hHandle事件的信号状态
当函数的执行时间超过dwMilliseconds就返回,
如果参数dwMilliseconds为INFINITE时 函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。
创建线程

AfxBeginThread

CreateThread

thread(C++11)

线程同步

WaitForSingleObject

WaitForMultipleObjects

  • 临界区(CCriticalSection)
  • 事件(CEvent)
  • 互斥量(CMutex)
  • 信号量(CSemaphore)

线程通信(发消息 发数据)

PostMessage

PostThreadMessage

网络编程

内存池 / 线程池 / 数据库(sqlite)/ 日志操作 缓存 / 脚本

参考博客:
https://www.cnblogs.com/wb118...


Simple
10 声望4 粉丝