多线程程序写日志时遇到加锁的问题

摘要:
前段时间在做项目时,系统是一个多线程程序。需要几个线程来写入日志。主线程和通信线程在写日志时经常发生冲突。要解决这个问题,请考虑在写入日志的方法中添加锁。

   前段时间在做项目时,系统是个多线程程序,几个线程都需要写日志,主线程和通讯线程经常在写日志时打架,为了解决这个问题,考虑在写日志的方法中加锁。代码如下:

     /// <summary>
        /// 写日志时加锁
        /// </summary>
        private static object m_Lock = new object();

        /// <summary>
        /// 写日志文件的接口函数,此函数只向指定的文件写入字符串

        /// </summary>
        /// <param name="DestFileName"></param>
        /// <param name="fmt"></param>
        /// <returns></returns>
        public static int TP_WriteAppLogFileEx(string DestFileName, string fmt)
        {
            string strLogFile = System.Environment.CurrentDirectory+"\\Log\\"+DateTime.Now.ToString("yyyyMMdd")+".log";
            if (strLogFile != DestFileName)
            {
                DestFileName = strLogFile;
            }
            int iWriteAppLogFile = 0;
            lock (m_Lock)
            {
                iWriteAppLogFile=TP_WriteAppLogFile(DestFileName, fmt);
            }
            return iWriteAppLogFile;
        }

 public static int TP_WriteAppLogFile(string DestFileName, string fmt)
        {
            try
            {
   FileInfo file = new FileInfo(DestFileName);

                if (!file.Exists)
                {
                    file.Create();
                }

                //定位到文件尾
                StreamWriter stream = file.AppendText();

                //写当前的时间
                stream.Write(DateTime.Now.ToString("HH:mm:ss fff "));

                //写用户传过来的字符串
                stream.WriteLine(fmt);

                //最后记着要关了它
                stream.Close(); 


            }
            catch (Exception e)
            {

            }

            return 0;
        }

经过加锁处理后,多线程写日志打架的问题得到了解决。

免责声明:文章转载自《多线程程序写日志时遇到加锁的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java的各类型数据在内存中分配情况详解数据连接池DruId的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows 最大支持线程数

WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 如将默认栈的大小改成512K,这样理论...

竞态与线程安全

竞态 对于同样的输入,程序的输出有时候正确而有时候却是错误的。这种一个计算结果的正确性与时间有关的现象就被称为竞态(RaceCondition) 导致竞态的常见原因是多个线程在没有采取任何措施的情况下并发更新、读取同一个共享变量。 竞态往往伴随着数据的脏读问题,即线程读取到一个过时的数据;丢失更新问题,即一个线程丢失数据所做的更新没有体现在后续其他线程对该...

Java多线程基础:进程和线程之由来

  在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程。当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累。由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助。   下面是本文的目录大纲:  ...

Java_如何等待子线程执行结束

工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标...

操作系统——进程,线程,锁

基本概念 状态、地址空间 三种基本状态 —— 就绪、运行、阻塞 进程控制块PCB(Process Control Block) 进程描述信息(如PID); 进程控制&管理信息(状态、优先级等); 源分配清单(地址空间状况、fd等); 处理其相关信息(各寄存器的值等) 进程存在的标识,在Linux系统中是task_struct,task_s...

消息机制、子窗口和父窗口的消息传递

1. 什么是窗口 MSDN: In a graphical Win32-based application, a window is a rectangular area of the screen where the application displays output and receives input from the user. Theref...