Linux平台下的多线程编程需要用到#include <pthread.h> 多线程相关操作头文件,可移植众多平台。
windows平台下有它自己的一套多线程编程操作,记录如下:
首先是创建线程的函数:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
一般情况下只需要用到第三个和第四个,第三个参数传递了一个函数的地址,就是线程内要执行的操作,第四个参数是传给新线程的参数指针。
如果只是简单的光使用线程函数,那么实际效果是混乱的,因为函数是并发运行,那么就要引入多线程的同步问题。
对于一个资源被多个线程共用会导致程序的混乱,我们的解决方法是只允许一个线程拥有对共享资源的独占,这样就能够解决上面的问题了。
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);
该函数用于创造一个独占资源,第一个参数我们没有使用,可以设为NULL,第二个参数指定该资源初始是否归属创建它的进程,第三个参数指定资源的名称。
HANDLE hMutex = CreateMutex(NULL,TRUE,"screen");
这条语句创造了一个名为screen并且归属于创建它的进程的资源
BOOL ReleaseMutex(
HANDLE hMutex // handle to mutex
);
该函数用于释放一个独占资源,进程一旦释放该资源,该资源就不再属于它了,如果还要用到,需要重新申请得到该资源。
申请资源的函数如下:
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
第一个参数指定所申请的资源的句柄,第二个参数一般指定为INFINITE,表示如果没有申请到资源就一直等待该资源,如果指定为0,表示一旦得不到资源就返回,也可以具体地指定等待多久才返回,单位是千分之一秒。
下面就是实际的小案例:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hMutex; //建立互斥锁
DWORD WINAPI Fun(LPVOID lpParamter) //线程要运行的函数
{
while (1) {
WaitForSingleObject(hMutex, INFINITE); //重新申请资源,建立互斥锁
cout << "Fun display!" << endl;
Sleep(1000);
ReleaseMutex(hMutex); //释放互斥锁和资源
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL); //建立线程
hMutex = CreateMutex(NULL, FALSE, L"screen");//初始化互斥锁,创建一个未命名的互斥体对象。
//如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。
CloseHandle(hThread); //如果后面用不到线程句柄则立即关闭句柄,并非关闭线程。
while (1) {
WaitForSingleObject(hMutex, INFINITE); //重新申请资源,建立互斥锁
cout << "main display!" << endl;
Sleep(1000);
ReleaseMutex(hMutex); //释放互斥锁和资源
}
return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter);
DWORD WINAPI MyThreadProc2(LPVOID lpParameter);
DWORD WINAPI MyThreadProc3(LPVOID lpParameter);
HANDLE hMutex;
int index = 100;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE handle1, handle2, handle3;
handle1 = CreateThread(NULL, 0, MyThreadProc1, NULL, 0, NULL);
handle2 = CreateThread(NULL, 0, MyThreadProc2, NULL, 0, NULL);
handle3 = CreateThread(NULL, 0, MyThreadProc3, NULL, 0, NULL);
if (NULL == handle1)
{
cout << "Create Thread failed !" << endl;
return -1;
}
if (NULL == handle2)
{
cout << "Create Thread failed !" << endl;
return -1;
}
if (NULL == handle3)
{
cout << "Create Thread failed !" << endl;
return -1;
}
CloseHandle(handle1);
CloseHandle(handle2);
CloseHandle(handle3);
hMutex = CreateMutex(NULL, FALSE, L"look");
while (1)
{
Sleep(1000);
}
return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(hMutex, INFINITE);
if (index > 0)
{
cout << "The Index1 Number is : " << index-- << endl;
Sleep(1);
ReleaseMutex(hMutex);
}
else
{
break;
ReleaseMutex(hMutex);
}
}
return 0;
}
DWORD WINAPI MyThreadProc2(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(hMutex, INFINITE);
if (index > 0)
{
cout << "The Index2 Number is : " << index-- << endl;
Sleep(1);
ReleaseMutex(hMutex);
}
else
{
ReleaseMutex(hMutex);
break;
}
}
return 0;
}
DWORD WINAPI MyThreadProc3(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(hMutex, INFINITE);
if (index > 0)
{
cout << "The Index3 Number is : " << index-- << endl;
Sleep(1);
ReleaseMutex(hMutex);
}
else
{
ReleaseMutex(hMutex);
cout << index << endl;
break;
}
}
return 0;
}
以上就是一个最简单的winapi实现的多线程实例了。