请教一个多线程问题:在三个线程里都同时用到了 同一个全局变量 的问题???
请问一个多线程问题:
我在三个线程里都同时用到了 同一个全局变量,是不是一定要加上 synchronize 呀???
可是加上后,程序每隔20秒左右会停住(感觉运行不过来一样),五六秒之后就又正常了,这样一直运行着;
如果不用synchronize 的话运行时正常,可是线程会在运行几十次之后就停止啦。
我在线程里加了sleep(15000);对那个全局变量,有读和写的操作。
[解决办法]
synchronize,是指同步,就没个线程用读取和写都是同一个,
你代码有问题,帖出来看看
[解决办法]
可以单独定义一个累来读写临界值(参考TThreadList类)
在类中:
1、定义:
FLock: TRTLCriticalSection;
2、初始化:
InitializeCriticalSection(FLock);
FList := TStringlist.Create;
3、使用互斥临界
EnterCriticalSection(FLock);
FList.Add(p);
LeaveCriticalSection(FLock);
4、删除临界
DeleteCriticalSection(FLock);
[解决办法]
{ TThreadList class }
TThreadList = class
private
FList: TList;
FLock: TRTLCriticalSection;
FDuplicates: TDuplicates;
public
constructor Create;
destructor Destroy; override;
procedure Add(Item: Pointer);
procedure Clear;
function LockList: TList;
procedure Remove(Item: Pointer);
procedure UnlockList;
property Duplicates: TDuplicates read FDuplicates write FDuplicates;
end;
{ TThreadList }
constructor TThreadList.Create;
begin
inherited Create;
InitializeCriticalSection(FLock);
FList := TList.Create;
FDuplicates := dupIgnore;
end;
destructor TThreadList.Destroy;
begin
LockList; // Make sure nobody else is inside the list.
try
FList.Free;
inherited Destroy;
finally
UnlockList;
DeleteCriticalSection(FLock);
end;
end;
procedure TThreadList.Add(Item: Pointer);
begin
LockList;
try
if (Duplicates = dupAccept) or
(FList.IndexOf(Item) = -1) then
FList.Add(Item)
else if Duplicates = dupError then
FList.Error(@SDuplicateItem, Integer(Item));
finally
UnlockList;
end;
end;
procedure TThreadList.Clear;
begin
LockList;
try
FList.Clear;
finally
UnlockList;
end;
end;
function TThreadList.LockList: TList;
begin
EnterCriticalSection(FLock);
Result := FList;
end;
procedure TThreadList.Remove(Item: Pointer);
begin
LockList;
try
FList.Remove(Item);
finally
UnlockList;
end;
end;
procedure TThreadList.UnlockList;
begin
LeaveCriticalSection(FLock);
end;
[解决办法]
对
[解决办法]
关于全局变量,在同一进程内用临界区比较好,上面已经给了代码,这里就不多说了,
关于synchronize ,更多的是用在和VCL界面的同步,他通过消息的形式,使得方法在主线程内执行
[解决办法]
同意楼上的
[解决办法]
支持楼上用临界区和信号量
[解决办法]
同进程用临界区。
如果要全局变量是一个数字则可以用原子操作的方式。
《WINDOWS核心编程》搞一本看看就全明白了。
[解决办法]
借楼主宝地用一下,
临界区和青互斥体Mutex有什么不同么?