多个线程共享一批全局变量,老是出现OVERRUN错误!(100分)

  • 主题发起人 主题发起人 QiuXiaoFeng
  • 开始时间 开始时间
Q

QiuXiaoFeng

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的系统中运行两个线程,一个线程运行控制程序,实时的控制监视各个端口的状态
另一个线程运行串口通讯程序(大部分时间空闲),定时从串口接受数据,放入全局变量中
由控制线程读取,两个线程独立运行互不控制。在运行十几个小时后系统崩溃,用memproof
检查,发现大量的OVERRUN错误($0000001),有时出现ACCESS VIOLATION异常($C000005),
若停止通讯线程,则错误很少。
很显然,错误的根源是两个线程同时访问了同一变量,那么怎样在一个线程对变量操作
完成前禁止其他线程访问呢?我试用了互斥对象也不行,看资料说互斥对象,临界变量保护的
是某段代码,而我的两个线程毫无相同之处,急死我了!!!我该怎么办呢?
 
我用过一些共享,可能对你有启发。
我就是访问一个全局的数据结构,当某个线程可以访问时首先就将LOCK赋成TRUE
理论上我的这个方法还是会出现问题,但出现的可能是极其小。
while FData.lockdo
begin
//do nothing and wait
end
try
FData.lock:=true;
........
finally
FData.lock:=false;
end;

 
这属于线程同步问题。可以使用临界区、互斥量等线程同步方法。以临界区为例:
首先说明一个全局变量类型为TRTLCriticalSection.
var
CS:TRTLCriticalSEction;
在线程开始执行前调用下面的语句:
InitializeCriticalSection(CS);
在线程中访问全局量的语句前加上:
EnterCriticalSection(CS);
在访问全局变量的语句后面加上:
LeaveCriticalSection(CS);
程序结束时调用:
DeleteCriticalSection(CS);
 
车金明同志写得好,另外多线程还可以用事件:CreateEvent().
 
经常有人讨论"怎么防止程序运行多个实例".可能恰好可以解决你的问题
 
其实关于这方面的问题,我们应该找出一种彻底的解决方法,不要老是重复地
问这种怎么办的问题.只要把操作系统这门课好好学习一下就应该解决这些问题了,
其实,这算一个理论性挺强的问题啦.当初,如果没有这些关于线程互斥问题的经典
算法,那么,windons或是linux就不可能那么快问世了.具体的问题还可以在汤兴赢
的那本《操作系统》中看一下。这是一本关于线程操作的非常好的书。
 
这个问题好象已经被回答拉
再见
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
562
import
I
后退
顶部