jjzjj

MemoryBarrier

全部标签

c# - 在 HashSet<T> 中是否包含线程安全

查看Contains的代码在HashSet.NET源代码中的类,我找不到任何原因Contains不是线程安全的吗?我正在加载HashSet提前使用值,然后检查Contains在多线程中。AsParallel()循环。这有什么不安全的原因吗?我不愿意使用ConcurrentDictionary当我实际上不需要存储值时。 最佳答案 通常(通常)仅用于读取的集合是“非官方”线程安全的(我知道.NET中没有任何集合在读取期间会自行修改).有一些注意事项:项目本身可能不是线程安全的(但对于HashSet,这个问题应该被最小化,因为你不能从中提

C# 可变数组项?

我需要一个包含可变项的数组,但找不到实现该操作的方法。privatevolatileT[]_arr;这意味着_arr引用是可变的,但是它不保证_arr对象本身内部的项目的任何内容。有什么方法可以将_arr的项目标记为易变的吗?谢谢。编辑:根据binarycoder的答案构建了以下代码。这段代码使用起来线程安全吗?publicclassVolatileArray{privateT[]_arr;publicVolatileArray(intlength){_arr=newT[length];}publicVolatileArray(T[]arr){_arr=arr;}publicTthis

c# - 为什么 volatile 和 MemoryBarrier 不阻止操作重新排序?

如果我正确理解volatile和MemoryBarrier的含义,那么下面的程序将永远无法显示任何结果。每次我运行它时,它都会捕获写入操作的重新排序。我在Debug或Release中运行它并不重要。将它作为32位或64位应用程序运行也没有关系。为什么会这样?usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceFlipFlop{classProgram{//Declaringthesevariablesasvolatileshouldinstructcompilerto//flushallcache

c# - 在哪里放置栅栏/内存屏障以保证新的读取/提交的写入?

像许多其他人一样,我一直对不稳定的读/写和栅栏感到困惑。所以现在我正试图完全理解它们的作用。因此,volatile读取应该(1)表现出获取语义(2)保证读取的值是新鲜的,即它不是缓存值。让我们关注(2)。现在,I'veread也就是说,如果你想执行volatile读取,你应该在读取之后引入一个获取栅栏(或一个完整的栅栏),就像这样:intlocal=shared;Thread.MemoryBarrier();这究竟是如何防止读取操作使用以前缓存的值的?根据栅栏的定义(不允许读取/存储在栅栏上方/下方移动),我会在读取之前插入栅栏,防止读取越过栅栏并被移动及时向后(也就是被缓存)。防止读

c# - 何时在线程安全锁定代码中使用 'volatile' 或 'Thread.MemoryBarrier()'? (C#)

我什么时候应该使用volatile/Thread.MemoryBarrier()来保证线程安全? 最佳答案 当您想跨线程访问变量而不锁定时,您可以使用volatile/Thread.MemoryBarrier()。原子变量,例如int,总是一次性读取和写入整个变量。这意味着您永远不会在另一个线程更改它之前获得一半的值,而在它更改之后获得另一半。因此,您可以在不同线程中安全地读取和写入值,而无需同步。但是,编译器可能会优化一些读写操作,您可以使用volatile关键字来阻止这些操作。例如,如果您有这样的循环:sum=0;foreach

windows - 为什么可以将 MemoryBarrier 实现为对 xchg 的调用?

在msdn上http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspx,MemoryBarrier实现为对xchg的调用。//x86FORCEINLINEVOIDMemoryBarrier(VOID){LONGBarrier;__asm{xchgBarrier,eax}}我在“软件开发人员手册”中找不到一些资料。请告诉我原因。 最佳答案 这里发生了两件事:编译器被赋予一个不透明block以插入到输出指令流中。由于它不知道block内访问

c# - 这是对 Thread.MemoryBarrier() 的正确使用吗?

假设我有一个字段控制某个循环的执行:privatestaticboolshouldRun=true;我有一个正在运行的线程,其代码如下:while(shouldRun){//Dosomework....Thread.MemoryBarrier();}现在,另一个线程可能会将shouldRun设置为false,而不使用任何同步机制。据我了解Thread.MemoryBarrier(),在while循环中进行此调用将阻止我的工作线程获取shouldRun的缓存版本,并有效地防止无限循环的发生.我对Thread.MemoryBarrier的理解是否正确?鉴于我有可以设置shouldRun变量

c# - 为什么我们需要 Thread.MemoryBarrier()?

在“C#4inaNutshell”中,作者展示了这个类有时可以在没有MemoryBarrier的情况下写入0,尽管我无法在我的Core2Duo中重现:publicclassFoo{int_answer;bool_complete;publicvoidA(){_answer=123;//Thread.MemoryBarrier();//Barrier1_complete=true;//Thread.MemoryBarrier();//Barrier2}publicvoidB(){//Thread.MemoryBarrier();//Barrier3if(_complete){//Thre