mig*_*jek 6 delphi multithreading
到目前为止,我认为对"共享"对象(多个线程通用)所做的任何操作都必须用"同步"保护,无论如何.显然,我错了 - 在我最近研究的代码中有很多类(线程安全的,如作者声称的那样),并且其中只有一个使用Critical Section来处理几乎所有方法.
如何找到需要使用CriticalSection(或任何其他方法)保护我的代码的哪些部分/方法,哪些不是?
到目前为止,我没有偶然发现任何有趣的解释/文章/博客说明,所有谷歌的结果是:
a)线程和GUI之间的同步示例.从简单的进度条到最复杂的,但仍然很明显:每次访问/修改GUI组件的属性时,请在"同步"中执行此操作.但仅此而已.
b)解释关键部分,互斥体等的文章.只是一种不同的保护/同步方法.
c)非常非常简单的线程安全类(线程安全堆栈或列表)的示例 - 它们都是相同的 - 实现锁定/解锁方法,它们进入/离开临界区并在锁定时返回实际的堆栈/列表指针.
现在我正在寻找解释哪些部分代码应该受到保护的解释.
可能是代码的形式;)但请不要再向我提供"使用Synchronize更新进度条"...;)
谢谢!
您要求对一般问题的具体答案.
基本上,除了UI操作之外,您应该保护每个共享内存/资源访问,以避免两个潜在的竞争线程:
通常,我认为任何其他操作线程都是安全的,包括访问非共享内存或不共享对象的操作.
例如,考虑以下对象:
type
TThrdExample = class
private
FValue: Integer;
public
procedure Inc;
procedure Dec;
function Value: Integer;
procedure ThreadInc;
procedure ThreadDec;
function ThreadValue: Integer;
end;
ThreadVar
ThreadValue: Integer;
Run Code Online (Sandbox Code Playgroud)
Inc,Dec和Value是在FValue字段上运行的方法.在使用某种同步机制保护方法之前,这些方法不是线程安全的.它可以是Value函数的MultipleReaderExclusiveWriterSinchronizer和Inc和Dec方法的CriticalSection.
ThreadInc和ThreadDec方法在ThreadValue变量上运行,它被定义为ThreadVar,所以我认为它是ThreadSafe,因为它们访问的内存不是在线程之间共享的......来自不同线程的每次调用都会访问不同的内存地址.
如果您知道,按照设计,只应在一个线程或其他同步机制中使用类,您可以自由地考虑该线程的安全设计.
如果您想要更具体的答案,我建议您尝试更具体的问题.
最好的祝福.
编辑:也许有人说整数字段是一个坏的例子,因为你可以考虑整数运算原子在英特尔/ Windows上因此不需要保护它...但我希望你明白这一点.
归档时间: |
|
查看次数: |
2204 次 |
最近记录: |