如何锁定一全局变量,急死了,我在线恭候!(100分)

  • 主题发起人 主题发起人 xjahello
  • 开始时间 开始时间
X

xjahello

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在子线程中修改一全局变量,且在主线程给它赋初值。我是用TCriticalSection锁定,怎老不成功
在主线程里好象不能锁,锁就提出空地址错误,我没用过这个,具体是怎么做的,望多指点一下。谢谢
 
什么变量?说细一点。
 
太笼统!!
 
请详细点!
 
主线程赋初值,其他线程调用TCriticalSection进行读写,记得leave。用
mainunit;
b : TCriticalSection;

mythreadunit;
b.enter;
try
MainUnit.xx:=yy;
finally
b.leave
end;
 
记得先b:=TCriticalSection.Create;
最后free
 
临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一段代码。可以在这样的代码中访问全局变量。
主线程只有一个,定义一段一次只能由一个主线程来执行的代码没有任何意义。
 
子线程关于该变量的都通过Synchronize调用执行就行了。
TMyThread = class(TThread)
private
FBackupValue: Integer;
// 因为Synchronize没参数,只好自己来!
procedure SetValue;
// 赋值给全局变量
...
end;

procedure TMyThread.SetValue;
begin
TheVariant := FBackupValue;
// 赋值给全局变量
end;

// 调用举例
FBackupValue := NewValue;
Synchronize(SetValue);
 
楼主把问题丢下来然后自己不来了。
Synchronize不如CriticalSection。为什么?因为Synchronize会将更新变量的操作变成
一个通知消息,一直要等到消息循环到这里才处理,等于还是在主线程中更新变量。这还
用多线程干嘛?按楼主说的逻辑,CriticalSection应该能够解决的。
 
CriticalSection的高效是有代价的,那就是不能在加锁主线程(进程),
只能在各个子线程之间使用!楼主的命题好像已经很清楚的写明了跟主线程
有关嘛!
 
逻辑上主线程赋初值的时候线程应该还没有运行甚至还没有创建。如果能够保证主线程不
对变量作写操作主线程是不需要锁的,何况主线程从来就不应该锁。
 
当然,Barton的逻辑是对的,只是表述上有些可以改善的地方,另外,未免有些教条主义……
我是非常不欣赏教条的。
1、先初始化再使用!这样表述也许更直接清楚些。
2、严格上说,其实只有可能造成冲突的线程之间才需要锁定的,CriticalSection其实
仍然有滥杀无辜的嫌疑,只是,除非有特定的需求,否则已经可以将就着用了。
3、对于对进程或者线程的锁定问题,其实没有什么应该不应该的,有需要就应该,不需要
就不应该,在某些特定应用下,挂起某些进程的做法也不是没有。再说,锁定线程
等待另一个线程执行完毕,在DBMS应用中比比皆是,在这里,根本就不区分主次。
 
建议看看《Delphi 5开发人员指南》第十一章,11.3.2 线程同步,讲的很清楚了,它给出的示例程序和楼主的几乎一样。
下载:http://fdelphi.myrice.com/delphidoc.html
 
后退
顶部