VC 线程模型 初始化 、销毁 、驱动,事件与临界区

测试代码:

  1 //线程模型开始,都可以作为类的成员变量
  2 HANDLE                m_hLogThread;
  3 CEvt                m_evLogList;
  4 CCriSec                m_csLogList;
  5 //等待线程消息
  6 void WaitForWriteLogThreadComplete()
  7 {
  8     m_evLogList.Set();
  9     VERIFY(::WaitForSingleObject(m_hLogThread, INFINITE) == WAIT_OBJECT_0);
 10
 11     ::CloseHandle(m_hLogThread);
 12     m_hLogThread    = NULL;
 13 }
 14
 15 //线程函数体
 16
 17 UINT WINAPI LogThreadFunc(LPVOID pv)
 18 {
 19     CT1Dlg* pThis    = (CT1Dlg*)pv;
 20     ASSERT(pThis);
 21
 22     MYList<int > lsLogList;
 23
 24     while(TRUE)
 25     {
 26         VERIFY(::WaitForSingleObject(m_evLogList, INFINITE) == WAIT_OBJECT_0);
 27         {
 28             CCriSecLock locallock(m_csLogList);
 29
 30             if(pThis->m_nDataListForThread != 0)
 31             {
 32                 TRACE("前:mList_size=%d %d\n",pThis->m_lsLogList.size(),lsLogList.size());
 33                 pThis->m_lsLogList.swap(lsLogList);
 34                 TRACE("后:mList_size=%d %d\n",pThis->m_lsLogList.size(),lsLogList.size());
 35             }
 36             else
 37             {
 38                 pThis->m_lsLogList.clear();
 39                 return 0;
 40             }
 41         }
 42
 43
 44
 45         while(lsLogList.size() > 0)
 46         {
 47             int iTemp = lsLogList.front();
 48             TRACE("iTemp=%X %d\n",GetCurrentThreadId(),iTemp);
 49             lsLogList.pop_front();
 50         }
 51
 52         //销毁文件句柄
 53     }
 54
 55     return 0;
 56 }
 57
 58
 59
 60
 61
 62 void CT1Dlg::OnButton15() //初始化线程
 63 {
 64     // TODO: Add your control notification handler code here
 65     //construct init
 66         m_hLogThread= NULL;
 67         m_nDataListForThread=1;
 68     //end construct init
 69     m_hLogThread = (HANDLE)_beginthreadex(NULL, 0, LogThreadFunc, (LPVOID)this, 0, NULL);
 70
 71     if(!m_hLogThread)
 72     {
 73         TRACE("线程创建失败!\n");
 74         return ;
 75     }
 76
 77 }
 78
 79 void CT1Dlg::OnButton17() //销毁线程
 80 {
 81     // TODO: Add your control notification handler code here
 82
 83     m_nDataListForThread =0;//none
 84     if(m_hLogThread)
 85     {
 86         WaitForWriteLogThreadComplete();
 87     }
 88
 89 }
 90
 91 void CT1Dlg::OnButton16() //线程驱动 需要线程做某件耗时或不能让主线程卡死的事
 92 {
 93     // TODO: Add your control notification handler code here
 94     static int cnt=0;
 95     {
 96         CCriSecLock locallock(m_csLogList);
 97         m_lsLogList.push_back(++cnt);
 98         m_lsLogList.push_back(++cnt);
 99         if(cnt>10) cnt =cnt %10;
100     }
101
102     m_evLogList.Set();
103 }

公共代码:感谢 cnblogscom/ldcsaa

CEvt:

 1 class CEvt
 2 {
 3 public:
 4     CEvt(BOOL bManualReset = FALSE, BOOL bInitialState = FALSE, LPCTSTR pszName = NULL, LPSECURITY_ATTRIBUTES pSecurity = NULL)
 5     {
 6         m_hEvent = ::CreateEvent(pSecurity, bManualReset, bInitialState, pszName);
 7         ASSERT(IsValid());
 8     }
 9
10     ~CEvt()
11     {
12         if(IsValid())
13             VERIFY(::CloseHandle(m_hEvent));
14     }
15
16     BOOL Open(DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName)
17     {
18         if(IsValid())
19             VERIFY(::CloseHandle(m_hEvent));
20
21         m_hEvent = ::OpenEvent(dwAccess, bInheritHandle, pszName);
22         return(IsValid());
23     }
24
25     BOOL Pulse()    {return(::PulseEvent(m_hEvent));}
26     BOOL Reset()    {return(::ResetEvent(m_hEvent));}
27     BOOL Set()        {return(::SetEvent(m_hEvent));}
28
29     HANDLE& GetHandle    ()     {return m_hEvent;}
30     operator HANDLE        ()    {return m_hEvent;}
31     BOOL IsValid        ()    {return m_hEvent != NULL;}
32
33 private:
34     CEvt(const CEvt&);
35     CEvt operator = (const CEvt&);
36
37 private:
38     HANDLE m_hEvent;
39 };

CCriSec:

 1 class CCriSec
 2 {
 3 public:
 4     CCriSec()        {::InitializeCriticalSection(&m_crisec);}
 5     ~CCriSec()        {::DeleteCriticalSection(&m_crisec);}
 6
 7     void Lock()        {::EnterCriticalSection(&m_crisec);}
 8     void Unlock()    {::LeaveCriticalSection(&m_crisec);}
 9
10 private:
11     CCriSec(const CCriSec& cs);
12     CCriSec operator = (const CCriSec& cs);
13
14 private:
15     CRITICAL_SECTION    m_crisec;
16 };

完。boyang987

时间: 2024-12-24 10:00:16

VC 线程模型 初始化 、销毁 、驱动,事件与临界区的相关文章

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

VC++线程同步(四) 事件使用例子

事件(Event)同步对象 (内核级别)事件内核对象包含: 1 一个使用计数器 2 一个表示事件是否是自动重置还是手动重置的布尔值 3 一个表示事件有没有被触发的布尔值 4 当触发为true时,等待该事件的线程变为可调度状态 5 事件的触发表示一个操作已经完成 作用: 通知其他线程,我已经完成读写操作了,轮到你们来做了. 他分为两种类型: 1是手动重置事件,也就是要进行手动的触发和非触发状态的切换. 2是自动重置事件,这种情况下只需要设置触发事件,不用管什么时候切换触发状态. 尽量使用手动重置方

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关

Netty实战七之EventLoop和线程模型

简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提高性能和可维护性. 1.线程模型概述 线程模型确定了代码的执行方式,由于我们总是必须规避并发执行可能会带来的副作用,所以理解所采用的并发模型(也有单线程的线程模型)的影响很重要. 因为具有多核心或多个CPU的计算机现在已经司空见惯,大多数的现代应用程序都利用了复杂的多线程处理技术以有效地利用系统资源

Netty线程模型

一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NIO客户端,向服务端发起TCP连接: 3)读取通信对端的请求或者应答消息: 4)向通信对端发送消息请求或者应答消息 Reactor单线程模型示意图如下所示: 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作.从架构层面看,一个NI

【转】netty线程模型

Netty服务器线程模型概览 博客分类: netty java 一切从ServerBootstrap开始 ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求. Java代码   bootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(),//boss线程池 Executors.newCached

秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

版权声明:本文为博主原创文章,未经博主允许不得转载. 前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> 来

Memcached线程模型分析

前面提到过Memcached的线程模型:Memcached使用Libevent,以此为基础来处理事件.其原理为:启动时的线程为main thread,它包含一个event_base,之后创建多个worker thread:每个work thread中也有一个event_base.main thread中的event_base负责监听网络,接收新连接:当建立连接后就把新连接交给worker thread来处理. Memcached的main函数在Memcached.c中.main函数中初始化了系统

Netty IO线程模型学习总结

Netty框架的 主要线程是IO线程,线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.下面我们先一起看下该模型 Reactor线程模型 Reactor 单线程模型 单线程模型中所有的IO操作都在一个NIO线程上操作: 包含接受客户端的请求,读取客户端的消息和应答.由于使用的是异步非阻塞的IO,所有的IO操作不会阻塞,理论上一个线程就可以处理所有的IO操作. 单线程模型适用小容量的应用.因为在高并发应用 可导致以下问题 一个线程同时处