相关疑难解决方法(0)

为什么锁(这个){...}不好?

MSDN文档说,

public class SomeObject
{
  public void SomeOperation()
  {
    lock(this)
    {
      //Access instance variables
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果可以公开访问实例,那就是"一个问题".我想知道为什么?是因为锁定的持有时间超过了必要的时间吗?还是有一些更阴险的原因?

c# multithreading locking

462
推荐指数
6
解决办法
15万
查看次数

TThreadedQueue不具备多个消费者的能力?

尝试在单个生产者多个消费者方案中使用TThreadedQueue(Generics.Collections).(DELPHI-XE).我们的想法是将对象推入队列,让几个工作线程排空队列.

但它没有按预期工作.当两个或多个工作线程调用PopItem时,将从TThreadedQueue抛出访问冲突.

如果对PopItem的调用是使用临界区序列化的,那么一切都很好.

当然,TThreadedQueue应该能够处理多个消费者,所以我错过了什么或者这是TThreadedQueue中的一个纯粹的错误?

这是一个产生错误的简单示例.

program TestThreadedQueue;

{$APPTYPE CONSOLE}

uses
//  FastMM4 in '..\..\..\FastMM4\FastMM4.pas',
  Windows,
  Messages,
  Classes,
  SysUtils,
  SyncObjs,
  Generics.Collections;

type TThreadTaskMsg =
       class(TObject)
         private
           threadID  : integer;
           threadMsg : string;
         public
           Constructor Create( ID : integer; const msg : string);
       end;

type TThreadReader =
       class(TThread)
         private
           fPopQueue   : TThreadedQueue<TObject>;
           fSync       : TCriticalSection;
           fMsg        : TThreadTaskMsg;
           fException  : Exception;
           procedure DoSync;
           procedure DoHandleException;
         public
           Constructor Create( popQueue : TThreadedQueue<TObject>;
                               sync     : TCriticalSection);
           procedure Execute; override;
       end;

Constructor TThreadReader.Create( popQueue : …
Run Code Online (Sandbox Code Playgroud)

delphi queue delphi-xe delphi-xe2

43
推荐指数
2
解决办法
5994
查看次数

在Delphi中,System.TMonitor.Pulse和TMonitor.PulseAll实际上做了什么

我很高兴看到Delphi在Delphi 2009中引入TMonitor记录,允许您在多线程环境中锁定特定对象.令我困惑的是这种记录类型的Pulse和PulseAll方法.

例如,Delphi的Pulse中的条目帮助指出"通知等待队列中的下一个线程,一旦调用线程释放对象,它就能锁定指定的对象."

真?那是什么意思?我使用过TMonitor而没有使用Pulse而没有问题.此外,在Delphi的源代码中,TMonitor的一些用途从不使用Pulse.

Pulse和PulseAll方法是否仅包含在Delphi的TMonitor记录中,用于与.NET Monitor类的源级兼容性,还是它们真的有用?

有两个问题("TMonitor.Pulse与TMonitor.PulseAll""Delphi系统单元中的TMonitor是什么有利于")这个问题,但我正在寻找一个明确的答案.

delphi multithreading synchronization delphi-2009 tmonitor

11
推荐指数
1
解决办法
1238
查看次数

TMonitor同步/ Application.ProcessMessages

我回来了另一个关于线程和同步的问题.想象一下,服务器应用程序必须执行冗长的操作,并且客户端希望他的GUI在等待服务器的响应时保持响应.我想到了以下模式:

TMonitor.Enter (FTCPClient);
try
  WorkerThread := TWorkerThread.Create (SomeLengthyServerOperation);
  while (not WorkerThread.Ready) do
    Application.ProcessMessages;
  DoSometingWithResults (WorkerThread.Result);
  WorkerThread.Free;      
finally
  TMonitor.Exit (FTCPClient);
end;
Run Code Online (Sandbox Code Playgroud)

WorkerThread是一个派生自TThread的简单类,它执行传递给其构造函数的函数,然后终止(使用Ready = True,结果为Result).只要单击按钮,就会执行显示的代码.

现在我的问题:如果我非常快地点击按钮两次,我会得到一些奇怪的错误,看起来很像服务器和客户端之间的通信以某种方式被误解,我想通过锁定FTCPClient对象来避免.Application.ProcessMessages执行后的事件处理程序是什么线程?是每个线程的TMonitor锁吗?这是否意味着如果我使用Application.ProcessMessages,锁不起作用?

我现在无法更好地解释它.我希望有人明白我的观点.如果没有,请随时提问.

编辑:对于按钮的禁用和启用:我对客户端代码一无所知.可能是一个按钮事件处理程序,可能是其他东西.基本上我想隐藏客户端代码的锁定.

delphi multithreading synchronization delphi-2009 tmonitor

2
推荐指数
1
解决办法
1853
查看次数