本周主要研究了多线程编程,包括WIN32 API的多线程编程,MFC框架多线程编程,QT框架中的多线程编程以及C++11中的基于Thread类的多线程。
(1)WIN 32 API编程
首先引入头文件<windows.h>,然后进行线程函数定义:DWORD WINAPI funThread (LPVOID lpParameter); 调用CreateThread函数来启动线程,其中CreateThread有好多参数,参数如下:
CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程安全属性,一般为null
_In_ SIZE_T dwStackSize,//为线程分配的堆栈大小,一般设为0
_In_ LPTHREAD_START_ROUTINE lpStartAddress,//线程启动函数,函数名,即funThread
_In_opt_ __drv_aliasesMem LPVOID lpParameter,//为线程传递的参数
_In_ DWORD dwCreationFlags,// 指定额外的标志来控制线程的创建,一般为0
_Out_opt_ LPDWORD lpThreadId // 返回线程的ID,传为0表示不需要ID
);
参数的传递:在主线程中传入type*类型参数给子线程,在子线程函数中进行接收,接收的形式为:type* n = (type*)lpParameter;
(2)MFC界面程序中的多线程
首先声明线程函数UINT MyThreadFunction( LPVOID pParam ); 然后在CWinThread* AFXAPI AfxBeginThread(
AFX_THREADPROC pfnThreadProc, //调用的线程函数地址(回调函数)
LPVOID pParam,//给线程函数传递的参数
int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级
UINT nStackSize = 0,//线程堆栈大小
DWORD dwCreateFlags = 0, //现成的标识
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL); //线程的安全属性
中进行创建线程。
MFC中常用实现线程同步的方法:
a互斥量:
HANDLE hmutex;
Hmutex = CreateMutex(NULL,FALSE,NULL);
WaitForSingleObject(hmutex,INFINITE);
//需要同步的代码;
ReleaseMutex(hmutex);
b临界区:
CRITCAL_SECTION section;
InitializeCriticalSection(§ion);
EnterCriticalSection(§ion);
//需要同步的代码;
LeaveCriticalSection(§ion);
c事件对象:
HANDLE hevent;
Hevent=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hevent);
WaitForSingleObject(hevent,INFINITE);
ResetEvent(hevent);
//需要同步的代码
SetEvent(hevent);
(3)QT多线程编程
方法1:继承Qthread类,然后重写run()方法。run()中的内容都会在子线程中执行。
方法2:定义工作线程Work类继承Qobject类,然后用MoveToThread()函数;定义一个Qthread qthread,然后Work *pWork;pWork = new Work(); pWork->moveToThread(&qthread);
(4)C++11中多线程的方法
定义线程函数void funThread();
#include<Thread>头文件;
Thread t(funThread);
t.join()或者t.detach()来启动线程。
互斥量mutex类进行线程同步:
#include<mutex>
mutex mu;
mu.lock();
//需要同步的代码;
mu.unlock();