》》》关于线程互斥的若干问题!!! (300分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
我有TDataList类。定义如下:
TDataList = class
public
constructor create(const BasePath:string);
destructor destroy;override;
function GetSL(i:integer):string;//取数据
procedure WriteSL(s:string);//增加
procedure ShowState(s:string);//用TStringGrid控件显示各线程状态
procedure WriteError(s:string);//在TMemo控件中显示异常情况
protected
SL : TStringList;
DataListLock : Tcriticalsection;
end;
我在主线程中创建TDataList类。

问题:
1、在多线程中不断调用GetSL读SL不写SL,需要线程互斥吗?为什么?多个线程序同时调用一个对象的函数或者过程会不会出问题?
2、在多线程中,不断调用GetSL读SL,偶尔调用WriteSL写SL。需要实现线程互斥,是用临界段DataListLock,还是共享读-独占写呢?为什么?如果用共享读-独占写应该怎么实现?
3、在多线程中,需要调用WriteError函数在TMemo控件中显示异常情况。如果用临界段DataListLock实现的话,DataListLock应该放在WriteError函数中?
procedure TDataList.WriteError(s:string);
begin
DataListLock.Enter;
MainForm.ErrorMemo.Lines.Add(s);
DataListLock.Leave;
end;
还是每次调用WriteError函数都要对WriteError函数进行DataListLock呢?
DataListLock.Enter;
WriteError(s);
DataListLock.Leave;
为什么?还是问题1的最后那个问题,多个线程序同时调用一个对象的函数或者过程会不会出问题?
4、在多线程中,需要调用ShowState函数用TStringGrid控件显示各线程状态,每个线程对应不同的Cells,需要线程互斥吗?为什么?
5、在多线程中,同时用LoadFromFile打开某文件对SL进行赋值会不会产生冲突呢?
 
1、在多线程中不断调用GetSL读SL不写SL,需要线程互斥吗?为什么?多个线程序同时调用一个对象的函数或者过程会不会出问题?
--这个要看TStringList的实现机制,读SL不能保证在TStringList内部没有修改其内部变量的操作,所以最好还是加上互斥,当然你如果仔细地研究过TStringList的源码,保证其内部没有这种操作,当然也可以不加,不过不建议这么做,因为不能保证未来的TStringList实现不会有这样的操作。
2、在多线程中,不断调用GetSL读SL,偶尔调用WriteSL写SL。需要实现线程互斥,是用临界段DataListLock,还是共享读-独占写呢?为什么?如果用共享读-独占写应该怎么实现?
--因为上述原因,所以最好用互斥,如果一定要用共享读-独占写,可以用:TMultiReadExclusiveWrite类进行。
3、在多线程中,需要调用WriteError函数在TMemo控件中显示异常情况。如果用临界段DataListLock实现的话,DataListLock应该放在WriteError函数中?
procedure TDataList.WriteError(s:string);
begin
DataListLock.Enter;
MainForm.ErrorMemo.Lines.Add(s);
DataListLock.Leave;
end;
还是每次调用WriteError函数都要对WriteError函数进行DataListLock呢?
DataListLock.Enter;
WriteError(s);
DataListLock.Leave;
为什么?还是问题1的最后那个问题,多个线程序同时调用一个对象的函数或者过程会不会出问题?
--两种方法是一样的,放到WriteError里用起来方便,建议这么做。互斥锁是用于保护数据访问,防止冲突的,所以应该为每个共享数据提供独立的锁,而不是共用(共用当然也没有问题,但会由于不必要的互斥降低性能)。另外对于可视控件进行加锁操作不一定能防止共享冲突,因为主线程对可视控件的操作不在锁的保护中,所以建议对可视控件还是用Synchronize为好。
4、在多线程中,需要调用ShowState函数用TStringGrid控件显示各线程状态,每个线程对应不同的Cells,需要线程互斥吗?为什么?
--如上所述,互斥是不够的,最好用Synchronize
5、在多线程中,同时用LoadFromFile打开某文件对SL进行赋值会不会产生冲突呢?
--这是对SL进行写操作,所以当然要保护。
 
对于3,
如果我在主线程中设置锁,所有线程都调用这锁,那应该可以了吧?
对于5,
我的意思是不同的线程对于自己的SL,然后同时对同一个文件进行读啊!
会不会产生冲突呢?
 
3、除非你在主线程中绝对不会对TStringGrid进行操作,或者每次对TStringGrid进行操作都调用锁。猛禽所说的做法是多线程中标准的处理方式。
5、按你所说的处理,要不冲突的应该有两个条件:1、各个线程有自己的SL,不会存在交叉处理的方式(主线程也不会对其他线程中的SL进行处理)。2、只对同一个文件进行读操作。
 
谢谢大家的帮忙!
 
后退
顶部