VC++ 多线程同步实例
test.hclass{
public:static DWORD WINAPI DoScanRdpWeakPwdProcess(LPVOID lpParam);
}test.cpp函数(){HANDLE thread_listening_rdp = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)CScanWeakPasswd::DoScanRdpWeakPwdProcess, this, 0, NULL);
}DWORD WINAPI CScanWeakPasswd::DoScanRdpWeakPwdProcess(LPVOID lpParam)
{CScanWeakPasswd* pScanWeakPwd = (CScanWeakPasswd*)lpParam;while (1){Sleep(10);//HWND hWnd = ::FindWindow(NULL, "test999");//if (hWnd)//{// bRDP = true;// PostMessage(hWnd, WM_QUIT, 0, 0);//}HWND hWnd = ::FindWindow(NULL, "Remote Desktop Security");if (hWnd){PostMessage(hWnd, WM_QUIT, 0, 0);}}return 0;
}
临界区
#include "stdafx.h"
#include<windows.h>
#include<iostream>
using namespace std;int number = 1; //定义全局变量
CRITICAL_SECTION Critical; //定义临界区句柄unsigned long __stdcall ThreadProc1(void* lp)
{while (number < 100){EnterCriticalSection(&Critical);cout << "thread 1 :"<<number << endl;++number;Sleep(100);LeaveCriticalSection(&Critical);}return 0;
}unsigned long __stdcall ThreadProc2(void* lp)
{while (number < 100){EnterCriticalSection(&Critical);cout << "thread 2 :"<<number << endl;++number;Sleep(100);LeaveCriticalSection(&Critical);}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{InitializeCriticalSection(&Critical); //初始化临界区对象CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);Sleep(10 * 1000);system("pause");return 0;
}
运行结果:
事件
事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:
(1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
(2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
使用”事件”机制应注意以下事项:
(1)如果跨进程访问事件,必须对事件命名,在对事件命名的时候,要注意不要与系统命名空间中的其它全局命名对象冲突;
(2)事件是否要自动恢复;
(3)事件的初始状态设置。
由于event对象属于内核对象,故进程B可以调用OpenEvent函数通过对象的名字获得进程A中event对象的句柄,然后将这个句柄用于ResetEvent、SetEvent和WaitForMultipleObjects等函数中。此法可以实现一个进程的线程控制另一进程中线程的运行,例如:
HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true,"MyEvent");
ResetEvent(hEvent);
代码示例:
#include "stdafx.h"
#include<windows.h>
#include<iostream>
using namespace std;int number = 1; //定义全局变量
HANDLE hEvent; //定义事件句柄unsigned long __stdcall ThreadProc1(void* lp)
{while (number < 100){WaitForSingleObject(hEvent, INFINITE); //等待对象为有信号状态cout << "thread 1 :" << number << endl;++number;Sleep(100);SetEvent(hEvent);}return 0;
}unsigned long __stdcall ThreadProc2(void* lp)
{while (number < 100){WaitForSingleObject(hEvent, INFINITE); //等待对象为有信号状态cout << "thread 2 :" << number << endl;++number;Sleep(100);SetEvent(hEvent);}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);hEvent = CreateEvent(NULL, FALSE, TRUE, L"event");Sleep(10 * 1000);system("pause");return 0;
}
运行结果:
信号量
信号量是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问。
信号量的特点和用途可用下列几句话定义:
(1)如果当前资源的数量大于0,则信号量有效;
(2)如果当前资源数量是0,则信号量无效;
(3)系统决不允许当前资源的数量为负值;
(4)当前资源数量决不能大于最大资源数量。
创建信号量
函数原型为:
1 2 3 4 5 |
|
释放信号量
通过调用ReleaseSemaphore函数,线程就能够对信标的当前资源数量进行递增,该函数原型为:
1 2 3 4 5 |
|
打开信号量
和其他核心对象一样,信号量也可以通过名字跨进程访问,打开信号量的API为:
1 2 3 4 5 |
|
代码示例:
#include "stdafx.h"
#include<windows.h>
#include<iostream>
using namespace std;int number = 1; //定义全局变量
HANDLE hSemaphore; //定义信号量句柄unsigned long __stdcall ThreadProc1(void* lp)
{long count;while (number < 100){WaitForSingleObject(hSemaphore, INFINITE); //等待信号量为有信号状态cout << "thread 1 :" << number << endl;++number;Sleep(100);ReleaseSemaphore(hSemaphore, 1, &count);}return 0;
}unsigned long __stdcall ThreadProc2(void* lp)
{long count;while (number < 100){WaitForSingleObject(hSemaphore, INFINITE); //等待信号量为有信号状态cout << "thread 2 :" << number << endl;++number;Sleep(100);ReleaseSemaphore(hSemaphore, 1, &count);}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{hSemaphore = CreateSemaphore(NULL, 1, 100, L"sema");CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);Sleep(10 * 1000);system("pause");return 0;
}
运行结果:
互斥量
采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
代码示例:
#include "stdafx.h"
#include<windows.h>
#include<iostream>
using namespace std;int number = 1; //定义全局变量
HANDLE hMutex; //定义互斥对象句柄unsigned long __stdcall ThreadProc1(void* lp)
{while (number < 100){WaitForSingleObject(hMutex, INFINITE);cout << "thread 1 :" << number << endl;++number;Sleep(100);ReleaseMutex(hMutex);}return 0;
}unsigned long __stdcall ThreadProc2(void* lp)
{while (number < 100){WaitForSingleObject(hMutex, INFINITE);cout << "thread 2 :" << number << endl;++number;Sleep(100);ReleaseMutex(hMutex);}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{hMutex = CreateMutex(NULL, false, L"mutex"); //创建互斥对象CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);Sleep(10 * 1000);system("pause");return 0;
}
运行结果:
VC++ 多线程同步实例相关推荐
- vc多线程同步的方法
1.CEvent CEvent eventObj; //初始化 eventObj.Lock();//在使用的线程等待,可加等待时间 eventObj.PulseEvent();//在需要时释放 2.M ...
- VC 多线程同步方式操作串口
#include<windows.h> #include<iostream> using namespace std; DWORD WINAPI CommReceive(LPV ...
- python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例
一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...
- VC++多线程编程[转]
2019独角兽企业重金招聘Python工程师标准>>> VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对 ...
- 《转》VC++多线程编程
原地址:http://www.cnblogs.com/wxfasdic/archive/2010/09/23/1833522.html 留个纪念,不错的总结.十个例子清晰列举啦多线程编程的奥妙. V ...
- VC多线程编程(转)
VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETH ...
- 【转】windows平台多线程同步之Mutex的应用
线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. 操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...
- 线程同步锁 java_java多线程同步之重入锁,详细解析
上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
最新文章
- 32位 shell.efi x86_Ubuntu 20.04 LTS或不再支持32位x86 (i386)
- 5G NR SRS (R15)
- 安卓9.0官方系统升级包_华为、荣耀公布可升级安卓10.0机型,你的手机在名单之内吗?...
- C++头文件的防卫式声明(为了防止多次include)
- C——printf和scanf返回值问题
- 百分点零售行业大数据解决方案
- 【数据结构和算法笔记】哈夫曼树的概念,构造和应用(利用哈夫曼编码压缩文本)
- Android自定义样式
- 合适的大数据安全分析平台如何选择
- AndroMDA 4.x架构
- CTFHUB Web前置技能 题解记录(HTTP部分)
- AUTOCAD——快速提取说明文字
- 农夫山泉溜到了下坡路
- httpclient封装工具类
- 数据分析2_使用Tableau进行收视率分析
- Linux (Centos)删除文件找回
- 架构师进阶之路——1、持久化框架(一)
- dede linux伪静态,织梦dedecms手机版伪静态教程
- 马云:做公益不是为了做给别人看,而是你自己相信
- 从网页中唤起桌面应用程序
热门文章
- 生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络
- AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac
- netty在项目中实际使用_聚合氯化铝在实际使用中的用法和用量
- TypeError: __init__() got an unexpected keyword argument ‘任意数‘的原因及解决办法
- laragon环境安装新的php版本后弹出php startup
- flutter listview 滚动到底部_??一个高颜值Flutter版WanAndroid客户端
- matlab中asix off_matlab中 hold on 与hold off的用法
- xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA收发器架构之硬件设计指导(一)
- python怎样实现多表连接_Python Day45多表连接查询
- PHP笔记-学生成绩例子