A服务产生N个日志文件,我用相同的代码创建的N个线程,去读取这N个日志文件,一旦某一个线程T1在文件里发现某个字符串,就重启一个A服务,怎么样才能保证T1在重启A服务的时候,其他线程不会再去重启A服务?谢谢!!

解决方案 »

  1.   

    用临界区临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由
    一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内,另
    一个线程在第一个线程处理完之前是不会被执行的。
    在使用临界区之前,必须使用InitializeCriticalSection()过程来初始化它。
    其声明如下:
       procedure InitializeCriticalSection(Var lpCriticalSection:TRTLCriticalSection);stdcall;lpCriticalSection参数是一个TRTLCriticalSection类型的记录,并且是变参。至于TRTLCriticalSection
    是如何定义的,这并不重要,因为很少需要查看这个记录中的具体内容。只需要在lpCriticalSection中传
    递未初始化的记录,InitializeCriticalSection()过程就会填充这个记录。
    注意Microsoft故意隐瞒了TRTLCriticalSection的细节。因为,其内容在不同的硬件平台上是
    不同的。在基于Intel的平台上,TRTLCriticalSection包含一个计数器、一个指示当前线程句柄
    的域和一个系统事件的句柄。在Alpha平台上,计数器被替换为一种Alpha-CPU数据结构,称
    为spinlock。
    在记录被填充后,我们就可以开始创建临界区了。这时我们需要用EnterCriticalSection()和
    LeaveCriticalSection()来封装代码块。这两个过程的声明如下:
      procedure EnterCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall;
      procedure LeaveCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall;正如你所想的,参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。
    当你不需要TRTLCriticalSection记录时,应当调用DeleteCriticalSection()过程,下面是它的声明:
    procedureDeleteCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;
    (摘自Delphi5开发人员指南)