自己最近写的一组日志处理类(线程调度优化)

原创 2012年04月01日 08:18:28

前面分享的一篇文章<<自己最近写的一组日志处理类(支持高并发处理)>>里写了一个多线程的写日志的类,当时测试的时候没有太注意,后面发现这个日志类占用cpu太厉害,经过调试发现问题出在对于线程的挂起(Suspend)和唤醒(Resume)上面(这两个方法已经在新的框架里里面被废掉了).我调用这两个方法的目的就是在没有日志写的时候,线程不要再运行,等待有需要写日志的时候再继续工作.后面改了一种方式来实现这个目的,CPU占用问题就解决了,当然下面的这种方式也是对线程挂起和唤醒的一种新的替代方式,下面是修改后的代码,注释很详细,原来的代码大家请参考前面的博文:

 /// <summary>
        /// 定义一个信号变量,采用的是ManualResetEvent
        /// </summary>
        private ManualResetEvent resumeEvent = new ManualResetEvent(false);

        /// <summary>
        /// 定义一个变量,用于记录线程是否处在pause状态.
        /// </summary>
        private volatile bool FPaused = false;
        /// <summary>
        /// 线程挂起
        /// </summary>
        public void Pause()
        {
            //如果当前线程不处在挂起状态就进行挂起操作
            if (FPaused == false)
            {
                FPaused = true;
                //重新设置信号量为初始状态
                resumeEvent.Reset();
                //进行线程等待.
                resumeEvent.WaitOne();
            }
        }
        /// <summary>
        /// 唤醒线程并继续执行
        /// </summary>
        public void Resume()
        {
            //如果在运行就不进行唤醒操作
            if (FPaused == true)
            {
                FPaused = false;
                //唤醒所有等待线程,本例中等待的只有当前写线程(因此也可以用AutoResetEvent来实现).
                resumeEvent.Set();
            }
        }

        private void WriteLogToFile()
        {

            while (FStop==false)
            {
                try
                {
                    //_streamWriter.Flush();
                    //Thread.Sleep(10000);
                    string theLogContent = null;
                    //队列操作时需要锁定,否则会报错.队列并不是线程安全的.
                    //但多个队列可以同时写.

                    lock (this)
                    {
                        theLogContent = _logCaches.Dequeue();
                    }
                    if (theLogContent != null && theLogContent != "")
                    {
                        _streamWriter.WriteLine(DateTime.Now.ToString() + ": " + theLogContent);
                        _streamWriter.Flush();
                        LastExecTime = DateTime.Now;
                    }
                    //修改调整处
                    //如果日志缓冲区为空,则挂起当前线程.
                    if (_logCaches.Count <= 0)
                    {
                        
                        this.Pause();
                        
                    }
                }
                catch (Exception ex)
                {
                    SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
                }

            }
        }


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

自己最近写的一组日志处理类(支持高并发处理)

下面的日志处理我在3000个线程同时调用,写20个文件,相当于每个文件150个线程不间断大规模写.没问题,我提高到10000时,出了问题,但不是日志代码的问题,而是系统创建新的线程时报错,建到3500...
  • hawksoft
  • hawksoft
  • 2012年01月21日 21:55
  • 7872

OpenMP(五)线程的调度优化

线程的调度优化 1. 引言     通过前边的介绍,知道了并行区域,默认情况下会自动生成与CPU个数相等的线程,然后并行执行并行区域中的代码。对于并行区域中的for循环有特殊的声明方式,这样不同的...
  • stormbjm
  • stormbjm
  • 2013年07月19日 21:54
  • 1092

自己写的String类

1:MyString.h #pragma once class myCString { public: int GetLength()const {return m_nLength;} ...
  • djb100316878
  • djb100316878
  • 2014年12月01日 08:49
  • 1255

XEN cpu 调度问题

公司新上了一个8核的cpu,上面用xen虚拟了2个Windows。 但是通过各种配置,还是无法平衡cpu的压力。 大多都压在第一个cpu上。 下面是top的数据 Cpu0  : 20.6%...
  • feiskyer
  • feiskyer
  • 2011年11月12日 19:09
  • 536

Python2.7 如何引入自己写的类

系统环境:win10 开发环境:JetBrains PyCharm 2017.1.5 x64 Python版本:2.7假如我们有一个class叫DBUtil,它在A.py里(最好一个py文件中对应...
  • hengbao4
  • hengbao4
  • 2017年07月24日 10:26
  • 1009

关于线程调度和线程调度消耗的讨论贴

关于线程调度和线程切换 背景知识: 调度:就是选出下一个要在cpu上执行的线程。优先级:“剥夺”式调度的依据,windows将线程的优先级分为32个级别,0最低,31最高就绪队列:window...
  • vba_2001
  • vba_2001
  • 2011年11月02日 12:22
  • 1198

Java ----类加载器(自己写)

每一个技术,最好掌握以下底层的原理,这样才能得心应手
  • yangxin_blog
  • yangxin_blog
  • 2015年09月04日 22:34
  • 946

自己写一个异常类my_own_exception来感知一下异常机制

在本文中, 我自己来写一个异常类my_own_exception, 主要为了感知一下C++异常机制, 看代码: #include using namespace std; class my_own...
  • stpeace
  • stpeace
  • 2015年03月25日 22:31
  • 3571

QT教程1:QT如何写类

写这个教程的原因来自于我自己要写一个类给其他的工程人员用,所以我要写一个类,他方便调用我的类,这个问题的来源就是这样子的。 如何写呢,点击QT文件  —-》新建------》文件和类----...
  • qq_23100787
  • qq_23100787
  • 2016年04月22日 22:24
  • 745

Python 封装使用日志处理类

在logging的基础上封装一个简易的日志处理类,同时输出到日志文件和打印到屏幕 import logging import logging.handlersclass Log: __file...
  • u011261430
  • u011261430
  • 2017年06月01日 14:29
  • 351
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己最近写的一组日志处理类(线程调度优化)
举报原因:
原因补充:

(最多只允许输入30个字)