
多线程
小米的修行之路
是日已过,命亦随减;如少水鱼,斯有何乐?当勤精进,如救头燃!但念无常,慎勿放逸。
展开
-
单例线程类封装
1、基类:#pragma once#include <Windows.h>class ThreadBase{public: BOOL start(BOOL bSuspend = FALSE); void stop(); HANDLE get_handle(); DWORD get_id(); DWORD suspend(); DWORD resume();...原创 2019-12-17 16:35:22 · 222 阅读 · 0 评论 -
基于信号量等待函数的封装
#ifndef _ZZC_SEMWAIT_#define _ZZC_SEMWAIT_#include "Windows.h"class CSemMgr{public: CSemMgr() { m_hSem = INVALID_HANDLE_VALUE; } ~CSemMgr() { if(m_hSem != INVALID_HANDLE_VALUE) { ...原创 2018-07-12 18:03:47 · 300 阅读 · 0 评论 -
线程类的封装
#ifndef _ZZC_THREAD_#define _ZZC_THREAD_/* 继承子类来使用*/#include <process.h>#include "Windows.h"class ThreadMGR{public: ThreadMGR() { m_hThread = INVALID_HANDLE_VALUE; } ~Threa...原创 2018-07-12 18:01:05 · 552 阅读 · 0 评论 -
Windows线程池每隔一段时间调用一个函数
1、定义一个回调函数,用来在特定的时间执行特定的任务:VOID CALLBACK TimeoutCallback( PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PTP_TIMER pTimer);2、创建一个线程池定时器来和回调函数绑定:PTP_TIMER CreateThreadpoolTimer( ...原创 2018-02-23 10:47:36 · 652 阅读 · 0 评论 -
线程同步之Signal ObjectAndWait()
前面提到过使用PulseEvent()函数时,如果线程还没准备好处于等待状态的话,那么这个触发脉冲就会丢失掉。例如下面的代码:线程一:SetEvent(hEvent1);WaiForSingleObject(hEvent2,INFINITE);线程二:WaiForSingleObject(hEvent1,INFINITE);PulseEvent(hEvent2);上面代码就会发原创 2018-01-31 16:26:17 · 660 阅读 · 0 评论 -
事件对象之 PulseEvent( )
BOOL PulseEvent( );Sets the state of the event to signaled (available), releases any waiting threads, and resets it to nonsignaled (unavailable) automatically.与SetEvent()函数的区别在于两点,PulseEvent( )相当原创 2018-01-31 16:03:02 · 1519 阅读 · 0 评论 -
临界区和代码段与条件变量的混合使用
1、当读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据。同理,当写者线程把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空。条件变量的目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立,再唤醒自己。2、条件变量的使用方法:1)声明+初始化:CONDITION_VARIABLE cv;InitializeConditionVaria原创 2018-01-16 16:01:38 · 483 阅读 · 0 评论 -
Slim读写锁
基于http://blog.youkuaiyun.com/morewindows/article/details/7442333提出的经典问题,使用Slim读写锁解决。问题如下:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。要求:1.子线原创 2018-01-16 12:53:25 · 508 阅读 · 0 评论 -
多线程同步之关键代码段
1、关键段的使用步骤:1)声明一个全局的关键段结构体变量:CRITICAL_SECTION g_Cs;2)初始化结构体变量:void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);3)进入关键段区域:EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSect原创 2018-01-15 16:17:41 · 622 阅读 · 0 评论 -
多线程同步之原子互锁家族
只针对32位值。1、加减1操作:LONG InterlockedIncrement( LONG volatile* Addend);LONG InterlockedDecrement( LONG volatile* Addend);返回值:返回变量执行增减操作之后的值。使用:int nValue(0);InterlockedIncreme原创 2018-01-15 13:44:33 · 415 阅读 · 0 评论 -
CSingleLock使用方法
先上实例代码:class CDataArray{private: int iArray[10]; CMutex Mutex; CCriticalSection CritSection;public: CDataArray(){}; ~CDataArray(){}; void SetData(int iValue); void GetD原创 2017-04-11 15:34:04 · 12596 阅读 · 0 评论 -
多线程同步之互斥对象
一、互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。互斥对象包含一个使用数量、一个线程ID、一个计数器:其中ID标识了当前哪个线程拥有互斥对象,计数器用于表明该线程拥有互斥对象的次数。当该线程拥有互斥对象的次数为0时,表明该线程释放了互斥对象的所有权,互斥对象处于有信号状态,这样其它线程才可以主动去获得互斥对象的所有权。二、互斥对象的使用方法:1、创建一个互斥器:Creat原创 2017-03-14 10:09:12 · 692 阅读 · 0 评论