VS winapi C++多线程同步编程 CreateThread

来源:互联网 发布:万方数据库 知网 编辑:程序博客网 时间:2024/06/05 21:25

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实现的多线程实例了。

1 0
原创粉丝点击