C++ 多线程讲解及示例代码

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;
}

你可能感兴趣的:(多线程,C++,null,fun,attributes,winapi)