草庐IT

interlocked

全部标签

c# - 如何在 C# 中为枚举类型应用 InterLocked.Exchange?

publicenumMyEnum{Value1,Value2}classMyClass{privateMyEnum_field;publicMyEnumField//addedforconvenience{get{return_field;}set{Interlocked.Exchange(ref_field,value);//ERRORCS0452}}}可以通过以下方式解决:publicenumMyEnum{Value1,Value2}publicclassMyClass2{privateint_field;//changetointpublicMyEnumField//addedf

java - 可以创建可以原子交换的 AtomicReference 吗?

有什么方法可以实现一种引用类型,其值可以原子地与另一个交换?在Java中,我们有AtomicReference,它可以与局部变量交换,但不能与另一个AtomicReference交换。你可以这样做:AtomicReferencer1=newAtomicReference("hello");AtomicReferencer2=newAtomicReference("world");并结合两个操作来交换它们:r1.set(r2.getAndSet(r1.get()));但这会使它们处于不一致的状态,两者都包含"hello"。此外,即使您可以原子地交换它们,您仍然无法原子地(成对地)读取它们

c++ - _InterlockedCompareExchange 文档中 "The sign is ignored"的含义

_InterlockedCompareExchange的文档对每个参数说Thesignisignored.这是否意味着像0xffff和0x7fff(对于16位版本)这样的数字将被_InterlockedCompareExchange16等视为相等其他宽度内在函数?或者这是否意味着内在函数接受有符号和无符号整数?还是别的?如果这不是文档中的错误,它至少看起来是模棱两可的。 最佳答案 符号位不会被忽略,就像其他位一样进行比较。..CompareExchange..函数只关心位的相等性,不以任何特殊方式解释它们。在基于x86的系统上,它们

c++ - 有人可以帮助发现我的低锁定列表中的错误吗?

我在32位Windows上用C++编写了一个低锁列表。我在使用关键部分方面取得了很大的进步,但我希望有人能理智地检查我所做的是否正确,并且我所做的没有任何错误:#ifndef__LOW_LOCK_STACK_H_#define__LOW_LOCK_STACK_H_templateclassLowLockStack{protected:structEntry{Entry*pNext;T*pData;};unionHeader{__int64m_XChg;struct{Entry*m_pNext;__int16m_Depth;__int16m_Counter;};};Headerm_Hea

c++ - 使用 InterlockedCompareExchange 无锁

我正在尝试使用互锁操作使以下代码片段无锁,知道如何翻译吗?if(m_Ref==0xFFFF)m_Ref=1;else{if(++m_Ref==1)CallSomething();//}我在想类似的东西if(InterlockedCompareExchange(&m_Ref,1,0xFFFF)!=0xFFFF)){if(InterlockedIncrement(&m_Ref)==1)CallSomething();}这里面有什么问题/竞争吗? 最佳答案 从表面上看这看起来是正确的,但每次您连续使用两个互锁操作时,您都会将自己暴露在AB

c++ - InterlockedIncrement 用法

在阅读函数InterlockedIncrement时我看到了传递的变量必须在32位边界上对齐的注释。通常我见过这样使用InterlockedIncrement的代码:classA{public:A();voidf();private:volatilelongm_count;};A::A():m_count(0){}voidA::f(){::InterlockedIncrement(&m_count);}以上代码在多处理器系统中能否正常工作,还是我应该对此多加注意? 最佳答案 这取决于您的编译器设置。但是,默认情况下,八个字节及以下的

c# - 这是线程安全的吧?

只是检查..._count正在被安全访问,对吗?这两个方法都被多个线程访问。privateint_count;publicvoidCheckForWork(){if(_count>=MAXIMUM)return;Interlocked.Increment(ref_count);Taskt=Task.Run(()=>Work());t.ContinueWith(CompletedWorkHandler);}publicvoidCompletedWorkHandler(TaskcompletedTask){Interlocked.Decrement(ref_count);//Handlee

c# - 这是线程安全的吧?

只是检查..._count正在被安全访问,对吗?这两个方法都被多个线程访问。privateint_count;publicvoidCheckForWork(){if(_count>=MAXIMUM)return;Interlocked.Increment(ref_count);Taskt=Task.Run(()=>Work());t.ContinueWith(CompletedWorkHandler);}publicvoidCompletedWorkHandler(TaskcompletedTask){Interlocked.Decrement(ref_count);//Handlee

c# - 如何正确读取 Interlocked.Increment'ed int 字段?

假设我有一个非volatileint字段和一个Interlocked.Increment线程。另一个线程可以安全地直接读取这个,还是读取也需要互锁?我以前认为我必须使用互锁读取来保证我看到的是当前值,因为毕竟该字段不是易变的。我一直在使用Interlocked.CompareExchange(int,0,0)来实现这一点。但是,我偶然发现了thisanswer这表明实际上普通读取将始终看到Interlocked.Incremented值的当前版本,并且由于int读取已经是原子的,因此无需执行任何特殊操作。我还找到了arequestinwhichMicrosoftrejectsarequ

c# - 如何正确读取 Interlocked.Increment'ed int 字段?

假设我有一个非volatileint字段和一个Interlocked.Increment线程。另一个线程可以安全地直接读取这个,还是读取也需要互锁?我以前认为我必须使用互锁读取来保证我看到的是当前值,因为毕竟该字段不是易变的。我一直在使用Interlocked.CompareExchange(int,0,0)来实现这一点。但是,我偶然发现了thisanswer这表明实际上普通读取将始终看到Interlocked.Incremented值的当前版本,并且由于int读取已经是原子的,因此无需执行任何特殊操作。我还找到了arequestinwhichMicrosoftrejectsarequ