C# 在If条件中使用interlocated.decredition,是否会导致任何并发问题?
我正在创建一个自定义CountdownWaitHandle类,它具有以下方法:C# 在If条件中使用interlocated.decredition,是否会导致任何并发问题?,c#,multithreading,thread-safety,.net-3.5,C#,Multithreading,Thread Safety,.net 3.5,我正在创建一个自定义CountdownWaitHandle类,它具有以下方法: public void Signal() { if (Interlocked.Decrement(ref threadsInstances) <= 0) { mre.Set(); } } 公共无效信号() { 假设调用Interlocked.Increment将计数提高到零以上,则if(Interlocked.Decrement(ref threadsInstances
public void Signal()
{
if (Interlocked.Decrement(ref threadsInstances) <= 0)
{
mre.Set();
}
}
公共无效信号()
{
假设调用Interlocked.Increment
将计数提高到零以上,则if(Interlocked.Decrement(ref threadsInstances)Interlocked.Decrement
将按照本示例中的预期工作
当然,使用会比构建自己的同步对象更好。要回答这个问题,我们必须看到代码的“其他”部分,Wait()
部分和interlocted.Increment
我不能使用CountdownEvent.cs(.net 4),因为我使用的是.net 3.5。“if(interlocted.decreation)(ref threadsInstances)
lock(_lock)
{
if (--threadsInstances <= 0)
{
mre.Set();
}
}
public class CountdownWaitHandle : WaitHandle
{
private int threadsInstances = 0;
private ManualResetEvent mre;
private readonly object threadsyncAccess = new object();
public CountdownWaitHandle(int initialCount)
{
threadsInstances = initialCount;
mre = new ManualResetEvent(false);
}
public void AddCount()
{
Interlocked.Increment(ref threadsInstances);
}
public void Signal()
{
if (Interlocked.Decrement(ref threadsInstances) <= 0)
{
mre.Set();
}
}
public override bool WaitOne()
{
return mre.WaitOne();
}
}
public static void Main(String[] args)
{
CountdownWaitHandle customCountDown = new CountdownWaitHandle(0)
while (i < 100)
{
SpecificWork work1 = new SpecificWork (startPosition, endPosition, customCountDown);
customCountDown.AddCount();
ThreadPool.QueueUserWorkItem(PerformTask, work1); // after finish download it invokes to Signal method.
}
customCountDown.WaitOne();
}