Tag: 锁定

我可以为此方案设计任何无锁解决方案

我有一个简单的Employee类如下 public class Employee { public int ID { get; set; } public string LastName { get; set; } public string FirstName { get; set; } } 然后我有一个ProcessEmployees类,它在名为ProcessThisEmployee的方法中对这些员工进行并发处理。 在这种方法中,我必须调用第三方库方法。 到目前为止一切都很简单。 问题是用户在进行操作时选择取消此操作的某个时候,我需要对尚未完成处理的任何ThirdPartyLibrary类实例进行一些清理。 注意我对ThirdPartyLibrary类没有任何控制,并且它没有任何取消现有任务的机制。 它提供了一个Clean方法,我可以在任何调用SomeAPI尚未完成的实例上调用它。 因此,我正在维护所有实例的本地列表。 当用户选择取消操作时,我调用我的类的CleaupIfUserCancelOperation方法,即清理我本地列表中第三方库实例的方法。 以下是我的代码。 class ProcessEmployees { private List _Employees; List libraries = new List(); private object sync = new object(); public ProcessEmployees() […]

究竟什么“锁定”锁定?

我正在创建一个创建和管理多个套接字连接的类,它将从套接字接收的信息转发到主线程,反之亦然。 我传递大量信息的multithreading对我来说是新的(就像C#中的大多数事情一样),所以我需要澄清locks究竟是做什么的。 当我锁定方法的一部分时,它只确保没有其他线程可以进入该部分代码,或者它是否确实阻止该部分代码中的所有变量被其他线程修改,无论它们出现在何处? 例如: public class TestLock { public volatile int a = 0; public volatile int b = 2; private object ALock = new Object(); public TestLock() { } public void UnlockEdit(int atemp, int btemp) { a = atemp; b = btemp; } public void LockedEdit(int atemp, int btemp) { lock(ALock) { a = […]

C#并发,锁定和字典对象

我有一堆数据库实体加载到数据库对象中。 可以将相同的DB实体加载到多个DB对象中。 DB实体需要定期进行特殊处理。 此处理必须一次由一个线程执行。 在这里按顺序锁定。 编辑:重要说明:该过程调用慢速Web服务。 这就是我试图阻止并发的原因。 我不知道如何安全地完成没有锁。 所以我创建了一个“挂锁”对象,DB对象将引用该对象进行锁定。 挂锁对象是基于实体的,因此同一实体的两个或多个DB对象将使用相同的挂锁对象。 我使用数据库实体的ID作为密钥将这些挂锁存储在字典对象中。 挂锁对象也只是一个简单的字符串对象。 这是正确的方法吗? 我想我要么过度工程,要么简化这个。 如果方法是正确的,那么这段代码看起来如何? 它有效,但我还没有在负载下测试它。 谢谢 :) public static func(CustomObject o) { if (ReadyForUpdate(o)) { lock (LookupPadLockByID(object.ID) { if (ReadyForUpdate(o)) { PerformUpdate(object); } } } } private static readonly object padlockLock = new object(); private static readonly Dictionary padLocks = new Dictionary(); private static […]

ASP.NET中的全局变量

我希望阻止一个线程输入代码,而另一个线程仍在执行该位代码: 我目前正在进行以下操作: global.asax.cs private static bool _isProcessingNewIllustrationRequest; public static bool IsProcessingNewIllustrationRequest { get { return _isProcessingNewIllustrationRequest; } set { _isProcessingNewIllustrationRequest = value; } } 然后在MVC中: public ActionResult CreateNewApplication() { if (!Global.IsProcessingNewIllustrationRequest) { Global.IsProcessingNewIllustrationRequest = true; // DO WORK… RUN CODE Global.IsProcessingNewIllustrationRequest = false; return View(“Index”, model); } else { // DISPLAY A MESSAGE THAT ANOTHER […]

multithreading和锁定(线程安全操作)

所以我有一个类,有一些方法都使用锁定,以防止有人使用我的类的实例与多个线程访问它时发生奇怪的事情: public class SomeRandomClass { private object locker = new object(); public void MethodA() { lock (locker) { // Does something MethodB(); } } public void MethodB() { lock (locker) { // Does something else } } } 正如我们所看到的, MethodB()由MethodA()自动访问,但由于MethodA()当前已锁定了locker对象,因此无法使用。 我想公开访问MethodB() ,因此您可以在需要时手动调用它,但我不希望在MethodA()使用它(这就是我使用锁定器对象的原因)。 当然,当MethodB()正在做的事情时,我不希望MethodA()做事情。 我基本上只希望同时使用所有方法中的一个,但MethodA()需要以某种方式访问MethodB()而不删除锁(以便它始终保持完全线程安全)。 我真的希望我能提出的问题是可以理解的……如果对我的问题有任何疑问,请继续将其发布在下面。 答案/解决方案也非常感谢! 解决方案可能非常简单,我只是没有看到它。 顺便说一下,上面应该是C#-code。

C#互锁function作为锁机制?

当我读到有关ReaderWriterLockSlim锁定机制时, 有人提出Interlock Functions可用于更精细的锁定 另外,我在这里找到了 Marc的另一个答案: …写入对克隆副本进行更改,然后使用Interlocked.CompareExchange交换引用(如果另一个线程在临时中突变了引用,则重新应用它们的更改)。 好吧,目前我所知道的Interlocked对象,就是它(在multithreading环境中)用来做primefacesadditions , compare , compare , compareExchange操作。 (我知道如何使用它) 但是( 这是我的问题 ) – 题 我如何将其用作锁 ? (示例代码将非常感谢) 编辑 为简单起见,我粘贴了这段代码( 这不是线程安全的 – 如果同时由两个线程调用Go ,则可能会得到一个被零除错误 ): class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine (_val1 / _val2); _val2 = 0; […]

ASP.NET锁线程方法

我正在使用C#开发ASP.NET表单Web应用程序。 我有一个为客户创建新订单的方法。 它看起来与此类似; private string CreateOrder(string userName) { // Fetch current order Order order = FetchOrder(userName); if (order.OrderId == 0) { // Has no order yet, create a new one order.OrderNumber = Utility.GenerateOrderNumber(); order.Save(); } return order; } 这里的问题是,两个请求(线程)中的1个客户可能会导致此方法被调用两次,而另一个线程也可能在此方法中。 这可能导致创建两个订单。 如何正确锁定此方法,因此每个客户一次只能由一个线程执行? 我试过了; Mutex mutex = null; private string CreateOrder(string userName) { if (mutex == null) […]

这个锁有什么问题?

高度存在这个锁的问题,但我无法理解这是什么。 我强烈怀疑下面的例子没有足够的锁定。 那有什么问题呢? class example { object locker = new object(); void start() { for (int i = 0; i < 1000; i++) { (new Thread(dostuff)).Start(); } } void dostuff() { lock (locker) { //dosomething } } }

使用闭包而不是锁用于共享状态的优缺点是什么?

我正在尝试评估什么是在单作者单读者场景中共享状态的最快解决方案,其中读者只消耗作者分配的状态变量的最新值。 共享状态可以是任何托管类型(即引用或值类型)。 理想情况下,同步解决方案的工作速度与尽可能简单的非同步解决方案一样快,因为该方法可能会用于单线程和multithreading场景,可能需要数千次。 读取/写入的顺序无关紧要,只要读取器在某个时间范围内接收到最新值(即读取器只能读取,永远不会修改,因此更新时间无关紧要,只要它没有接收到旧价值之前的未来价值…) 天真的解决方案,没有锁定: var memory = default(int); var reader = Task.Run(() => { while (true) { func(memory); } }); var writer = Task.Run(() => { while (true) { memory = DateTime.Now.Ticks; } }); 天真解决方案的问题究竟是什么? 到目前为止我已经想到了这些: 无保证读者看到最新值(没有内存屏障/易失性) 如果共享变量的类型不是基本类型或引用类型(例如,复合值类型),则读取器消耗的值可能无效。 直接的解决方案是锁定: var gate = new object(); var memory = default(int); var reader = Task.Run(() => { […]

C#阻止从其他线程访问所有对象方法

我有一个对象,一次只能由一个Thread使用。 例如,我的对象包含3个方法A , B和C ,如果线程访问方法A ,我想锁定对象(所有方法/属性都被锁定)。 主要的困难是我无法修改该对象的代码。 我必须阻止multithreading访问我调用对象的位置。 我的第一个想法是使用单例模式,但我没有设法让它工作!