多线程一个时常遇到的问题。 CriticalSection 的使用方法?(20分)

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
在写多线程的程序时常要考虑到的同步问题。
以免几个线程同时访问一个变量,造成死锁。
可以使用 CriticalSection 但 我使用了好象没有什么效果。
m_Lock : TCriticalSection;
谁可以给点提示如何使用。
 
var
m_Lock : TCriticalSection;
begin
m_lock:=TTCriticalSection.create;//在form.oncreate时候创建.
m_Lock.Enter;
//访问变量操作
m_Lock.Leave;
。。。
end;
 
但我在一个线程里用
m_Lock.Enter
另一个线程也运行 m_Lock.Enter 会出现什么情况?
第二个线程会等待它直到 第一人线程运行 m_Lock.Leave.是不是?
如果有同一个线程里运行两次 m_Lock.Enter 会有什么情况?
 
?为什么要用2个m_Lock.Enter? 当你2个线程访问同一个变量的时候
用临界量保护起来,直到一个线程访问结束后leave,另一个线程才可以访问
只要一个
m_Lock.Enter;
//访问变量操作
m_Lock.Leave;
就可以了.
 
我的意思是第一个线程访问了一个变量还没有退出临界区。第二个线程
又运行到 m_Lock.Enter
这时会出现什么情况?
 
这时它就会等直到第一个线程访问完成时,它才能访问了。
 
多人接受答案了。
 
对VCL的操作呢,不采用TThread.Synchronize方法。也就是,不采用线程类,直接采用begin
Thread函数,访问VCL如何解决?
 
后退
顶部