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

HANDLE CreateSemaphore (

   PSECURITY_ATTRIBUTE psa, //信号量的安全属性

   LONG lInitialCount, //开始时可供使用的资源数

   LONG lMaximumCount, //最大资源数

   PCTSTR pszName);     //信号量的名称

  

释放信号量

通过调用ReleaseSemaphore函数,线程就能够对信标的当前资源数量进行递增,该函数原型为:

1

2

3

4

5

BOOL WINAPI ReleaseSemaphore(

   HANDLE hSemaphore,   //要增加的信号量句柄

   LONG lReleaseCount, //信号量的当前资源数增加lReleaseCount

   LPLONG lpPreviousCount  //增加前的数值返回

   );

打开信号量 

和其他核心对象一样,信号量也可以通过名字跨进程访问,打开信号量的API为:

1

2

3

4

5

HANDLE OpenSemaphore (

   DWORD fdwAccess,      //access

   BOOL bInherithandle,  //如果允许子进程继承句柄,则设为TRUE

   PCTSTR pszName  //指定要打开的对象的名字

  );

代码示例:

#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++ 多线程同步实例相关推荐

  1. vc多线程同步的方法

    1.CEvent CEvent eventObj; //初始化 eventObj.Lock();//在使用的线程等待,可加等待时间 eventObj.PulseEvent();//在需要时释放 2.M ...

  2. VC 多线程同步方式操作串口

    #include<windows.h> #include<iostream> using namespace std; DWORD WINAPI CommReceive(LPV ...

  3. python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例

    一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...

  4. VC++多线程编程[转]

    2019独角兽企业重金招聘Python工程师标准>>> VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对 ...

  5. 《转》VC++多线程编程

    原地址:http://www.cnblogs.com/wxfasdic/archive/2010/09/23/1833522.html 留个纪念,不错的总结.十个例子清晰列举啦多线程编程的奥妙.  V ...

  6. VC多线程编程(转)

    VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETH ...

  7. 【转】windows平台多线程同步之Mutex的应用

    线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...

  8. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  9. Servlet基础(三) Servlet的多线程同步问题

    Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...

最新文章

  1. 32位 shell.efi x86_Ubuntu 20.04 LTS或不再支持32位x86 (i386)
  2. 5G NR SRS (R15)
  3. 安卓9.0官方系统升级包_华为、荣耀公布可升级安卓10.0机型,你的手机在名单之内吗?...
  4. C++头文件的防卫式声明(为了防止多次include)
  5. C——printf和scanf返回值问题
  6. 百分点零售行业大数据解决方案
  7. 【数据结构和算法笔记】哈夫曼树的概念,构造和应用(利用哈夫曼编码压缩文本)
  8. Android自定义样式
  9. 合适的大数据安全分析平台如何选择
  10. AndroMDA 4.x架构
  11. CTFHUB Web前置技能 题解记录(HTTP部分)
  12. AUTOCAD——快速提取说明文字
  13. 农夫山泉溜到了下坡路
  14. httpclient封装工具类
  15. 数据分析2_使用Tableau进行收视率分析
  16. Linux (Centos)删除文件找回
  17. 架构师进阶之路——1、持久化框架(一)
  18. dede linux伪静态,织梦dedecms手机版伪静态教程
  19. 马云:做公益不是为了做给别人看,而是你自己相信
  20. 从网页中唤起桌面应用程序

热门文章

  1. 生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络
  2. AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac
  3. netty在项目中实际使用_聚合氯化铝在实际使用中的用法和用量
  4. TypeError: __init__() got an unexpected keyword argument ‘任意数‘的原因及解决办法
  5. laragon环境安装新的php版本后弹出php startup
  6. flutter listview 滚动到底部_??一个高颜值Flutter版WanAndroid客户端
  7. matlab中asix off_matlab中 hold on 与hold off的用法
  8. xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA收发器架构之硬件设计指导(一)
  9. python怎样实现多表连接_Python Day45多表连接查询
  10. PHP笔记-学生成绩例子