问题是,我使用了该信号量对象,那么我可能在各线程中要大量使用该对象
是不是该对象本身也有同步问题,
也就是说,TRTLCriticalSection对象本身也不可以在多处使用
:一个线程正使用TRTLCriticalSection对象,另一个也正用改对象,那么会出错否?

解决方案 »

  1.   

    不会
    CriticalSection根本就不能同入的
    CriticalSection本来就保证了独占访问
      

  2.   

    ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net) ( 四星(高级))
    老大
    var
    cs :TCriticalSection;
    cs :=TCriticalSection.create;cs.Acquire;
     dosomething1;
    cs.Release;我知道受保护区是每问题的,
    问题是我在多个线程中都能用该全局Cs对象吗,
    可以保护dosomething1;
    dosomething2;
    dosomething3;

    而不用多个TCriticalSection实例吗?
      

  3.   

    这东西本来设计就在多线程之间并发访问的,只是创建和销毁的时候要求只能由一个线程来执行,acquire/release则是可以在多线程之间并并发访问的看看他的windows实现代码,其实就是操作系统的rtl_critical_section的封装,acquire/调用的是EnterCriticalSection();release则调用LeaveCriticalSection();可以看到,tcriticalsection对象并没有直接操作fsection数据结构的成员,也没有涉及其他任何状态数据,完全由操作系统去处理竞争和同步,因此它本身是线程安全的,你就放心吧而实质上,一个tcriticalsection实例可以看作是一个匿名的唯一的信号灯,所以2个实例则是两个不同的信号灯,当你需要在某个线程已经在处理dosomething1()时防止其他线程同时处理dosomething2()和dosomething3(),那么使用一个信号灯,也就是使用一个tcriticalsection实例是正确的,也只有使用一个才是正确的,如果使用了2个或多个tcriticalsection实例,那么因为它们是不同的信号灯,所以并不会彼此阻塞,因此对于上面所说的这种具体应用来说是错误的
      

  4.   

    谢谢专家的解释!
    Dosomething1

    Dosomething2
    是两个不同的资源,我不在乎这两个资源是否会被不同线程同时处理
    我只关心他们要分别被独占,
    也就是说要保护Dosomething1时使用一个tcriticalsection实例,
    要保护Dosomething2时要用另一个tcriticalsection实例.
      

  5.   

    同时使用2个cs..容易造成死锁...
    ///////////////////////
    难道要不可以用多个tcriticalsection实例?
      

  6.   

    solokey(争取在2008年成为低级程序员) 
    能给指点否?