Tag: 锁定

线程同步。 完全锁定如何使内存访问“正确”?

首先,我知道lock{}是Monitor类的合成糖。 (哦, 语法糖) 我正在玩简单的multithreading问题,并发现无法完全理解锁定一些任意WORD的内存如何保护整个其他内存不被缓存的寄存器/ CPU缓存等。使用代码示例来解释我所说的内容更容易: for (int i = 0; i < 100 * 1000 * 1000; ++i) { ms_Sum += 1; } 最后, ms_Sum将包含100000000 ,这当然是预期的。 现在我们年龄将执行相同的周期,但在2个不同的线程上,上限减半。 for (int i = 0; i < 50 * 1000 * 1000; ++i) { ms_Sum += 1; } 由于没有同步,我们得到不正确的结果 – 在我的4核机器上,它是随机数近52 388 219 ,略大于100 000 000一半。 如果我们包含ms_Sum += […]

使用带有Threading.Timer的锁

我有一个Windows服务应用程序,它使用Threading.Timer和TimerCallback以特定的间隔进行一些处理。 我需要一次将此处理代码锁定为仅1个线程。 因此,例如,启动服务并触发第一个回调并启动一个线程并开始处理。 只要在下一次回调之前完成处理,这就可以正常工作。 所以说比如说处理比通常花费的时间稍长,并且在另一个线程正在处理时再次触发TimerCallback,我需要让该线程等到另一个线程完成。 这是我的代码示例: static Timer timer; static object locker = new object(); public void Start() { var callback = new TimerCallback(DoSomething); timer = new Timer(callback, null, 0, 10000); } public void DoSomething() { lock(locker) { // my processing code } } 这是一种安全的方法吗? 如果队列变得相当大,会发生什么? 有更好的选择吗?

我们需要在multithreading代码中读取.NET Int32时锁定它吗?

我正在阅读以下文章: http : //msdn.microsoft.com/en-us/magazine/cc817398.aspx “解决你的multithreading代码中的11个可能的问题”作者:Joe Duffy 它提出了一个问题:“我们需要在multithreading代码中读取它时锁定.NET Int32吗?” 据我所知,如果它是32位SO中的Int64,它可能会撕裂,正如文章中所解释的那样。 但对于Int32,我想到了以下情况: class Test { private int example = 0; private Object thisLock = new Object(); public void Add(int another) { lock(thisLock) { example += another; } } public int Read() { return example; } } 我没有看到在Read方法中包含锁的原因。 你呢? 更新基于答案(由Jon Skeet和ctacke提供)我理解上面的代码仍然容易受到多处理器缓存的影响(每个处理器都有自己的缓存,与其他处理器不同步)。 所有这三个修改都解决了这个问题: 添加“int example”的“volatile”属性 插入Thread.MemoryBarrier(); 在实际读取“int example”之前 在“lock(thisLock)”中读取“int […]

旋锁,它们有用吗?

您经常在代码中发现自己使用自旋锁吗? 遇到使用繁忙循环实际上优于锁的使用情况的情况有多常见? 就个人而言,当我编写某种需要线程安全的代码时,我倾向于使用不同的同步原语对其进行基准测试,并且就其而言,使用锁似乎比使用自旋锁具有更好的性能。 无论我实际持有锁的时间有多少,使用自旋锁时我收到的争用量远远大于使用锁时获得的数量(当然,我在多处理器机器上运行我的测试)。 我意识到它更可能遇到“低级”代码中的自旋锁,但我很想知道你是否发现它甚至可以用于更高级的编程?

如何使用互斥锁

我有一个线程,即通过tcp发送存储在List 类型的缓冲区中的数据。 另一个线程是写入缓冲区。 因为我对c#不是很熟悉,所以我想知道如何正确使用锁或Mutex。 这是我最终想要使用的代码: while(buffer.isLocked()) { buffer.wait(); } buffer.lockBuffer(); buffer.add(tcpPacket); buffer.unlockBuffer(); buffer.notify(); 这是我目前的代码。 我希望有人可以帮助我完成它。 public class Buffer { private Mutex mutex; private List buffer; private bool locked = false; public Buffer() { mutex = new Mutex(false); buffer = new List(); } public bool isLocked() { return locked; } public void lockBuffer() { if (!locked) […]

C#Lock语法 – 2个问题

我可以在锁中使用字符串作为锁定器吗? lock(“something”) 如果它只有一条线,我可以不用括号锁定吗? lock(“something”) foo();

是否可以读取文件?

我正在开发一个应用程序,它检查由单独的程序(不是由我编写)对文件所做的更改。 如果检测到更改,则会打开文件,读取最后一行,然后关闭文件。 我正在使用以下代码来确保我的程序不会尝试锁定文件,但只在读取模式下打开它: FileStream fs = new FileStream( _scannerFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader sr = new StreamReader(fs); var str = sr.ReadToEnd(); sr.Close(); fs.Close(); 不幸的是,尽管如此,每当我的程序尝试读取文件时,我仍然会收到以下错误: System.IO.IOException was unhandled Message=”The process cannot access the file ‘D:\\LSDATA\\IdText.txt’ because it is being used by another process.” Source=”mscorlib” StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess […]

Bitmap.LockBits是否将位图“固定”到内存中?

我最近使用锁定的位图,并且一直“试图访问无效内存”错误。 这主要是因为位图已在内存中移动。 有些人使用GCHandle.Alloc()在CLR中分配内存并固定它。 Bitmap.LockBits()也这样做吗? 我不明白“锁定”内存和“固定”内存之间的区别。 你能解释术语和差异吗?

在ASP.NET MVC应用程序中锁定一个全局对象时是否可能出现死锁?

对于锁定,我使用的是一个对我的应用程序来说是全局的静态对象: public class MvcApplication : System.Web.HttpApplication { public static readonly object AppLock = new object(); … } 用它来锁定代码: lock(MvcApplication.AppLock) { … } 我们暂时不要考虑性能影响。 我能100%确定在这种情况下我会避免死锁吗?

Monitor.Enter和Monitor.Exit在不同的线程中

Monitor.Enter和Monitor.Exit旨在从同一个线程调用。 但是,如果我需要在一个不同于获得的线程中释放锁定怎么办? 例如:存在使用此资源的共享资源和异步操作。 操作从BeginOperation开始,并获取共享资源上的锁定。 还有释放锁的EndOperation方法。 EndOperation通常在回调的另一个线程中调用,因此我无法在EndOperation方法中调用Monitor.Exit 。 在这种情况下,最好的方法是什么? 用AutoResetEvent而不是Monitor来仔细检查锁定是一个很好的解决方案吗?