VS winapiC++多线程同步编程 CreateThread

    xiaoxiao2021-03-25  134

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

    转载请注明原文地址: https://ju.6miu.com/read-4073.html

    最新回复(0)