在应用服务器端,我有两个procedure都要用到修改一个数组,可能会同时调用,怎么使它们不冲突? (300分)

  • 主题发起人 主题发起人 zhm_good
  • 开始时间 开始时间
Z

zhm_good

Unregistered / Unconfirmed
GUEST, unregistred user!
在应用服务器端,我有两个procedure都要用到修改一个数组,可能会同时调用,怎么使它们不冲突?远程数据模块中有一个接口要调用一个procedure,另有一个时钟也会定时调用别一个procedure ,这两个proceure都要修改一个数组,这样会冲突吗?我想会的。怎样处理呢?
这样行吗?
ver
rcs:TCriticalSection;
procedure a();
begin
rcs.Enter;
try
for i:=0 to Fusercount-1 do
FUserList.Fstatu:=0 ;
finally
rcs.Leave;
end;
end;

procedure b();
begin
rcs.Enter;
try
for i:=0 to Fusercount-1 do
FUserList.Fstatu:=1 ;
finally
rcs.Leave;
end;
end;
 
做一个信号灯,当一个procedure修改的时候,另一个procedure不能修改。
或利用线程的同步操作
 
如果没有在线程中调用这些过程,那么不需要使用信号灯。
因为主线程是顺序执行的,不存在并发访问的问题。放心吧。
 
希望更多的人参与进来,我心里还是没底啊![:(][:(]
 
不骗你,只要没有创建线程,就不需要考虑同步的问题。程序是顺序执行的。
很多时候,Timer中的事件没有按照指定的时间触发就是因为这个原因。(Timer在排队等待程序的顺序执行)

放心吧!!!!!!!^_^
 
不能用TCriticalSection临界区变量,应该用mutex互斥变量,临界区是控制不能同时运行一段代码,就像控制两个人不能同时过一个桥一样,你有两个过程执行修改数据,所以用临界区实现不了。
 
young0098说得有一定道理。不过你的程序是顺序执行的,不存在并发的问题。
 
这个三层的应用,其中一个procedure 被多个客户端频繁调用,一秒约100多次,应用服务器中的远程数据模块中的这个procedure要考虑并发吗?我想是不需要的。

谢谢,^nEWnEW^,young0098的参与,你们说得有一定道理。我就是担心客户端调用接口修改数组的同时,我的时钟也正好发生,此时它也会修改数组,但是这个mutex互斥变量怎么做呀,能不能给出一个小例子。多谢!
 
以前写的读者写着问题:

unit uMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

const
READERS=10; //Max readers at the same time

type
TfrmMain = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
btnDemo: TButton;
lbResult: TListBox;
btnClear: TButton;
btnClose: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnDemoClick(Sender: TObject);
procedure btnClearClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
procedure Reader;
procedure Writer;
public
end;

var
frmMain: TfrmMain;
SemaR: THandle; //Semaphore of reader
SemaW: THandle; //Semaphore of writer
CountR: Integer; //Count of readers
Target: Integer; //The variable to be operated on

implementation

{$R *.dfm}

{ ++++++++Reader++++++++ }
procedure TfrmMain.Reader;
var
str: String;
H, M, S, Ms: Word;
begin
Randomize;
//Start time
DecodeTime(Time,H,M,S,Ms);
str:= Format('[ %-2d:%-2d:%-2d:%-3d => R ] The value is: ',[H,M,S,Ms]);
Sleep(Random(500));
If WaitForSingleObject(SemaR, INFINITE)=WAIT_OBJECT_0 Then
Try
If (CountR=0) Then WaitForSingleObject(SemaW, INFINITE);
CountR:= CountR+1;
Finally
ReleaseSemaphore(SemaR, 1, Nil);
End;
//Begin of reading
str:= str+IntToStr(target);
SendMessage(frmMain.lbResult.Handle,lb_addstring,0,longint(str));
Sleep(Random(500));
//End of reading
If WaitForSingleObject(SemaR, INFINITE)=WAIT_OBJECT_0 Then
Try
CountR:= CountR-1;
If (CountR=0) Then ReleaseSemaphore(SemaW, 1, Nil);
Finally
ReleaseSemaphore(SemaR, 1, Nil);
End;
end;
{ --------Reader-------- }

{ ++++++++Writer++++++++ }
procedure TfrmMain.Writer;
var
str: String;
H, M, S, Ms: Word;
begin
Randomize;
//Start time
DecodeTime(Time,H,M,S,Ms);
str:= Format('[ %-2d:%-2d:%-2d:%-3d => W ] The value is: ',[H,M,S,Ms]);
Sleep(Random(500));
If WaitForSingleObject(SemaW, INFINITE)=WAIT_OBJECT_0 Then
Try
//Begin of writing
target:= target+1;
str:= str+IntToStr(target);
SendMessage(frmMain.lbResult.Handle,lb_addstring,0,longint(str));
Sleep(Random(500));
//End of writing
Finally
ReleaseSemaphore(SemaW, 1, Nil);
End;
end;
{ --------Writer-------- }

procedure TfrmMain.FormCreate(Sender: TObject);
begin
SemaR:= CreateSemaphore(Nil, READERS, READERS, 'Reader');
SemaW:= CreateSemaphore(Nil, 1, 1, 'Writer');
CountR:= 0;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
If SemaR<>0 Then CloseHandle(SemaR);
If SemaW<>0 Then CloseHandle(SemaW);
end;

procedure TfrmMain.btnDemoClick(Sender: TObject);
var
Id: DWord;
begin
CreateThread(Nil, 0, @TfrmMain.Reader, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Writer, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Reader, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Writer, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Reader, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Writer, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Reader, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Writer, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Reader, Nil, 0, Id);
CreateThread(Nil, 0, @TfrmMain.Writer, Nil, 0, Id);
end;

procedure TfrmMain.btnClearClick(Sender: TObject);
begin
lbResult.Clear;
end;

procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
Close;
end;

end.
 
^nEWnEW^ ---> 只要没有创建线程,就不需要考虑同步的问题。程序是顺序执行的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
同意!!!!!!!
 
程序没有考虑同步问题,测试了几次,是没问题哦。过几天没问题就把分都分了。
 
后退
顶部