我的理解的主要功能锁定关键字词从MSDN

锁的声明(C#参考)

锁定关键词标志着一个声明 块作为一个关键部分通过 取得相互排斥的锁 对给定的对象,执行一个 发言,然后释放 锁。

何时应该锁定可以使用?

例如这使得有意义与多应用程序,因为它保护数据。但它是必要的,当应用程序并不自任何其他线?

有性能的问题与使用锁?

我只是继承了一种应用是使用锁无处不在,它是个螺纹和我想知道我应该离开他们,是他们甚至有必要吗?

请注意,这是更多的一般知识的问题,应用程序的速度很好,我想知道如果这是一个好的设计图案,按照在未来的或者应该加以避免,除非绝对需要的。

有帮助吗?

解决方案

何时应该锁定可以使用?

锁定应该用于保护共有资源在多线程的代码。不为别的。

但它是必要的,当应用程序并不自任何其他线?

绝对不是。这只是一个浪费时间。但是可以肯定,你们不是隐含地使用系统的螺纹。例如,如果您使用异步I/O你可以收回调一个随机的螺纹,不是你原来的螺纹。

有性能的问题与使用锁?

是的。他们不是很大,在单一程序,但为什么打电话你不需要什么?

...如果这是一个好的设计图案,按照在未来[?]

锁定一切都无可奈何地是一个可怕的设计图案。如果你杂乱的代码是随机的锁定然后你决定使用一个背景线的一些工作,你可能遇到的僵局。共享的资源之间的多线程需要仔细设计,而更多的可以隔离的棘手的部分,更好。

其他提示

所有的答案在这里似乎正确的:锁定'有效性是块线从acessing锁码同时进行。然而,有很多微妙之处在这个领域,其中之一是,锁定块代码自动标示为 关键的区域 通过共同语言的运行时间。

效果的代码被标为关键的是,如果整个地区无法完全执行,运行时可能考虑你的整个应用领域是潜在危害,因此,卸载它从存储器。报价 MSDN:

例如,考虑一个任务是试图分配的记忆,同时保持锁。如果记忆配失败,中止的目前任务不足以确保稳定性的程序域,因为有可能是其他任务域中的等同锁。如果目前的任务被终止,其他任务可能陷于僵局。

因此,即使应用程序是单线,这可能是一个危险。考虑这一方法在锁定块投掷的一个例外,最终不处理内块。即使在例外处理,因为它的泡沫通过呼叫叠您的关键区域的代码没有完成。谁知道如何CLR会有什么反应?

更多信息,读 这篇文章的危险的螺纹。中止().

铭记,可能有理由为什么你的应用程序不作为单螺纹因为你的想法。异步I/O中。净可能回调一个游泳池线,例如,如执行一些各种计时器类(不Windows形式的计时器,虽然).

一般而言,如果应用程序是单螺纹,你不会得到多少利用了锁的发言。不知道你的申请没错,我不知道如果他们是有用的,或者不-但我怀疑不是。另外,如果在应用程序使用锁无处不在我不知道,我会觉得所有信心它的工作在多线程的环境不管怎么说-没有原始开发者 实际上 知道如何来发展多线程代码,或他们只是添加锁的发言无处不在的模糊的希望,即将做的伎俩?

锁定应该用代码,修改共同国家、国家修改的其他线程,以及其他那些踏板必须采取同样的锁。

锁实际上是一个内存入串行器,线(即采取锁)将等待上锁进入,直至当前线退出锁,因此存访问序列化。

来回答你的问题锁不需要在一个单一的螺纹应用程序,它具有性能的副作用。因为锁定在C#都是基于同步核对象和每个锁你采取创建一个过渡到核心模式,从用户的模式。

如果你有兴趣在多线程表现的一个良好的开始是 MSDN线的准则

你的 可以 有性能的问题,锁定变量,但通常情况下,就构造你的代码,以尽量减少长度的时间都花在内的"锁定"区块的代码。

尽除去锁。它将取决于究竟是什么代码是这样做的。虽然这是个螺纹,如果你的目的是实现为一个单独的,也是可能的,你会有多客户使用它的一个实例(在存储器、服务器上的)同时..

是的,会有一些性能损失时使用锁,但它一般是neglible够不重要。

使用锁(或任何其他相互排斥的声明或建造)通常只需要在多线程的情况多线程(无论是你自己造成的,或从你的呼叫者)都有机会进行互动的对象和变化的基础的状态或数据保持。例如,如果你有一个集合,可以通过多个线你不想要一个线程改变的内容,收集通过删除一个项目,而另一个线程是试图阅读。

锁定(令牌)是仅仅用于标记的一个或多个区块代码,不应该同时运行多个线程。如果应用程序是单程的,这是保护对一个条件,就不能存在。

和锁定并援引一个性能,加说明的检查同时进行访问之前,代码被执行。它应该只被使用必要的。

看看 的问题 关于'互斥'。然后看看 这些 两个 有关的问题中使用的'锁(Object)'声明,具体的说明。

有没有锁在应用程序,如果只有一个线程,是的,它是一个能打虽然它不会采取公平数目的呼吁,打到堆积成什么显着。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top