C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程程序。
创建线程函数:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, //默认安全级别0
SIZE_T dwStackSize, //堆栈大小默认(2M)
LPTHREAD_START_ROUTINElpStartAddress, //线程入口函数
LPVOID lpParameter, //参数
DWORD dwCreationFlags, //创建时的状态
LPDWORD lpThreadId //获得线程ID
);
----第一个参数是安全属性,一般设为nil,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
----第三个参数,也是最重要的一个,是一个指向函数名的指针,但传递时很简单,只需在线程函数名前加上@就可以了。
----第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为nil。
----第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。
----第六个参数是系统分配给这个线程的唯一的ID标志
创建独占资源函数:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // pointer to security attributes
BOOL bInitialOwner, // flag for initial ownership
LPCTSTR lpName // pointer to mutex-object name
);
----第二个参数指定该资源初始是否归属创建它的进程,true表示属于,互斥对象谁拥有谁释放,false代表当前没有线程拥有这个互斥对象。
----第三个参数指定资源的名称。
释放独占资源函数:
Bool ReleaseMutex(HANDLE hMutex);
----该函数用于释放一个独占资源,进程一旦释放该资源,该资源就不再属于它了,如果还要用到,需要重新申请得到该资源。
申请资源函数:
DWORD WaitForSingleObject
(
HANDLE hHandle;
DWORD dwMilliseconds
);
----第一个参数指定所申请的资源的句柄。
----第二个参数一般指定为INFINITE,表示如果没有申请到资源就一直等待该资源,如果指定为0,表示一旦得不到资源就返回,也可以具体地指定等待多久才返回,单位是千分之一秒。
示例代码:
#include <Windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;
HANDLE hMutex;
DWORD WINAPI fun(LPVOID lpParamter)
{
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
cout << "fun display!\n";
Sleep(1000);
ReleaseMutex(hMutex);
}
}
int main()
{
HANDLE hThread = CreateThread(NULL,0,fun,NULL,0,NULL);
//hMutex = CreateMutex(NULL,false,_TEXT("screen"));
hMutex = CreateMutex(NULL,false,_T("screen"));
CloseHandle(hThread);
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
cout << "main display!\n";
Sleep(2000);
ReleaseMutex(hMutex);
}
system("pause");
return 0;
}