一个进程中多线程数据共享(100分)

  • 主题发起人 主题发起人 surwaz
  • 开始时间 开始时间
S

surwaz

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个程序中开了多个线程,他们都要
读取主线程中的一大块数据,不知这样会
不会引起冲突,若有,怎么解决!

谢谢!
 
读没有问题。
如果还有写的,就要加保护了
可用Mutex
 
可用一BOOLEAN值作为判定此时数据是否正在读写.
 
请察看《操作系统概述》等书籍中的多线程问题的“读者写者”问题。
 
不知道你的线程是如何开的?如果是继承tthread类,可以试试self.Synchronize();
 
又是Synchronize,这个是用来进行VCL控件的显示安全的.
要多线程的同步/互斥,还是要用信号量或者临界区.
 
下面是双线程互斥,利用一个boolean变量
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
tmythread=class(tthread)
private
process:integer;
fbutton:tbutton;
public
procedure execute;override;
constructor create(tf:boolean;button:tbutton);
end;

var
Form1: TForm1;
b:boolean=true;
i:integer;
mythread:array[1..2] of tmythread;
a:char;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
a:='a';
for i:=1 to 2do
mythread:=tmythread.create(false,button1);
end;
constructor tmythread.create(tf:boolean;button:tbutton);
begin
inherited create(tf);
fbutton:=button;
end;
procedure tmythread.execute;
begin
b:=not b;
while bdo
;
if a='a' then
a:='b'
else
a:='c';
fbutton.caption:=a;
sleep(100);
b:=not b;
end;
end.
 
多人接受答案了。
 
后退
顶部