Tag: 易失性

安全读取long 内容的最快方法,其元素同时更改

当你有一个 long[] myArray = new long[256]; 其项目由多个线程使用更改 Interlocked.Increment(ref myArray[x]) 肯定不可能在某个时间点获取myArray的快照,因为同时存在非锁定写入,所以我不是想要得到它。 那么我真的需要Volatile.Read的每一个元素来获取过去某个时刻的所有值的副本吗? long[] copy = new long[256]; for (int i = 0; i < 256; i++) copy[i] = Volatile.Read(ref myArray[i]); 由于我对某个时间点的快照不感兴趣,过时的值不是问题,但由于64位非易失性读取不是primefaces的,我担心以下可能会给我一个预增量的一半long,和后增量的一半,可能会给出一个从未存在于数组中的值。 long[] copy = new long[256]; for (int i = 0; i < 256; i++) copy[i] = myArray[i]; 那么Volatile.Read变种是正确的选择,因为我不想使用任何锁定?

我们真的需要在C#中使用VOLATILE关键字吗?

这是我在工作站上尝试的代码。 class Program { public static volatile bool status = true; public static void Main() { Thread FirstStart = new Thread(threadrun); FirstStart.Start(); Thread.Sleep(200); Thread thirdstart = new Thread(threadrun2); thirdstart.Start(); Console.ReadLine(); } static void threadrun() { while (status) { Console.WriteLine(“Waiting..”); } } static void threadrun2() { status = false; Console.WriteLine(“the bool value is now made FALSE”); […]

为什么C#volatile不保护写 – 读重新排序?

根据这本在线书籍 ,C#中的volatile关键字不能防止重新排序Write操作,然后是Read操作。 它给出了这个例子,其中a和b都可以最终设置为0 ,尽管x和y是volatile : class IfYouThinkYouUnderstandVolatile { volatile int x, y; void Test1() // Executed on one thread { x = 1; // Volatile write (release-fence) int a = y; // Volatile read (acquire-fence) … } void Test2() // Executed on another thread { y = 1; // Volatile write (release-fence) int b = […]

访问MemoryStream的不同线程

有一些代码通过调用GetBuffer()将数据直接写入MemoryStream对象的数据缓冲区。 它还适当地使用和更新Position和SetLength()属性。 此代码在99.9999%的时间内正常工作。 从字面上看。 只有每隔几十万次的迭代它才会出现。 具体问题是MemoryStream的Position属性突然返回零而不是适当的值。 但是,添加了检查0的代码并抛出exception,其中包括在单独的方法中记录MemoryStream属性(如位置和长度)。 那些返回正确的值。 在同一方法中进一步添加日志记录表明,当出现这种罕见情况时,Position在此特定方法中仅为零。 好的。 显然,这必须是一个线程问题。 而且很可能是编译器优化问题。 但是,这个软件的本质是它由调度程序的“任务”组织,因此几个实际的操作系统线程中的任何一个都可以在任何给定时间运行此代码 – 但一次不得超过一个。 所以我的猜测通常会发生同样的线程不断用于此方法,然后在极少数情况下使用不同的线程。 (只需编写想法,通过捕获和比较线程ID来测试这个理论。) 然后由于编译器优化,不同的线程永远不会得到正确的值。 它得到一个“陈旧”的价值。 通常在这种情况下,我会将“volatile”关键字应用于相关变量,以查看是否可以修复它。 但在这种情况下,变量位于MemoryStream对象中。 有没有人有任何其他想法? 或者这是否意味着我们必须实现自己的MemoryStream对象? 真诚的,韦恩 编辑:只运行一个测试,计算此方法的调用总数,并计算ManagedThreadId与上次调用的次数不同的次数。 它几乎完全是50%的时间切换线程 – 在它们之间交替。 所以我上面的理论几乎肯定是错的,或者错误会更频繁地发生。 编辑:这个错误很少发生,它需要将近一个星期没有错误运行之前感到有任何信心,它真的消失了。 相反,最好运行实验来确切地确定问题的本质。 编辑:当前锁定是通过使用MemoryStream的5种方法中的每一种中的lock()语句来处理的。

C#编译器优化和volatile关键字

我已经阅读了一些关于volatile关键字和没有此关键字的行为的post。 我特别测试了C#中说明volatile关键字用法的答案代码。 运行时,我会在发布模式下观察exception行为,不附加调试器。 到目前为止,没有问题。 所以,据我所知,以下代码永远不会退出。 public class Program { private bool stopThread; public void Test() { while (!stopThread) { } // Read stopThread which is not marked as volatile Console.WriteLine(“Stopped.”); } private static void Main() { Program program = new Program(); Thread thread = new Thread(program.Test); thread.Start(); Console.WriteLine(“Press a key to stop the thread.”); Console.ReadKey(); […]

Interlocked是否保证C#中其他线程的可见性,还是仍然需要使用volatile?

我一直在阅读类似问题的答案,但我仍然有点困惑……亚伯有一个很好的答案,但这是我不确定的部分: …声明变量volatile会使每次访问都变得不稳定。 不可能以任何其他方式强制执行此行为,因此不能用Interlocked替换volatile。 在其他库,接口或硬件可以访问您的变量并随时更新它或需要最新版本的情况下,这是必需的。 Interlocked是否保证对所有线程的primefaces操作的可见性,或者我是否仍然必须在值上使用volatile关键字以保证对更改的可见性? 这是我的例子: volatile int value = 100000; // 0) { // do something } } public void AThreadMethod() { while(value > 0) { // do something } } 更新: 我是一个糟糕的运动,我改变了原来的例子,所以这里又是: public class CountDownLatch { private volatile int m_remain; // <— do I need the volatile keyword here? private EventWaitHandle m_event; public […]

EventWaitHandle是否有任何隐式的MemoryBarrier?

这个网站的新用户,如果我没有以可接受的方式发帖,请告诉我。 我经常在下面的示例中编写一些代码(为了清楚起见,使用Dispose ommtited等内容)。 我的问题是,如图所示需要挥发物吗? 或者,当我读过Thread.Start时,ManualResetEvent.Set是否有隐式内存屏障? 或者显式的MemoryBarrier调用是否比volatile更好? 还是完全错了? 此外,据我所见,某些操作中的“隐式记忆障碍行为”没有记录,这是非常恐怖的,这些操作的列表是否存在? 谢谢,汤姆 : class OneUseBackgroundOp { // background args private string _x; private object _y; private long _z; // background results private volatile DateTime _a private volatile double _b; private volatile object _c; // thread control private Thread _task; private ManualResetEvent _completedSignal; private volatile bool _completed; public bool […]

为什么局部变量不能在C#中出现波动?

public void MyTest() { bool eventFinished = false; myEventRaiser.OnEvent += delegate { doStuff(); eventFinished = true; }; myEventRaiser.RaiseEventInSeperateThread() while(!eventFinished) Thread.Sleep(1); Assert.That(stuff); } 为什么eventFinished不能变得不稳定并且重要吗? 在我看来,在这种情况下,编译器或运行时可能会变得聪明,并且在while循环中“知道”eventFinished只能为false。 特别是当您考虑提升变量作为类的成员生成的方式以及委托作为同一类的方法时,从而剥夺了eventFinished曾经是局部变量这一事实的优化。

使用volatile关键字与使用Interlocked类相比有什么优势吗?

换句话说,我可以使用常规变量和Interlocked类无法解决的volatile变量吗?

受欢迎的“挥发性民意调查旗帜”模式是否破裂?

假设我想在线程之间使用布尔状态标志来进行协作取消。 (我意识到最好使用CancellationTokenSource ;这不是这个问题的重点。) private volatile bool _stopping; public void Start() { var thread = new Thread(() => { while (!_stopping) { // Do computation lasting around 10 seconds. } }); thread.Start(); } public void Stop() { _stopping = true; } 问 :如果我在0s调用Start()而在另一个线程调用3s的Stop() ,那么循环是否保证在当前迭代结束时在10s左右退出? 我见过的绝大多数消息来源表明上述内容应该按预期工作; 见: MSDN ; Jon Skeet ; 布赖恩吉迪恩 ; 马克格拉维尔 ; Remus […]