C# 在If条件中使用interlocated.decredition,是否会导致任何并发问题?

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

我正在创建一个自定义CountdownWaitHandle类,它具有以下方法:

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();
                }