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实现的多线程实例了。
- VS winapi C++多线程同步编程 CreateThread
- CreateThread多线程编程测试
- 多线程编程 CreateThread
- C-多线程-代码-CreateThread
- 多线程编程一---CreateThread透析
- 多线程编程 - 从 CreateThread 说起
- CreateThread简单那多线程编程
- CreateThread简单那多线程编程
- 多线程编程(一)——CreateThread
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- c++中的多线程编程技术Createthread()
- 多线程编程(1)- 从 CreateThread 说起
- 多线程编程(2) - 从 CreateThread 说起[续]
- 一步一步学习多线程编程之CreateThread
- WIN32多线程编程( CreateThread 版本)
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- oracle 用户与表空间关系
- mongoengine的数量获取
- 冒泡排序
- C++中string的用法 string字符串的使用方法
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- VS winapi C++多线程同步编程 CreateThread
- linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: deprecated syntax
- 直接插入排序
- Qt 的QString类的使用
- leetcode解题之20 # Valid Parentheses Java版
- 数据库迁移+升级
- SVN管理
- JS变量复制和参数传递
- js链表学习