Are C# structs thread safe?

前端 未结 6 2033
感情败类
感情败类 2020-12-03 12:22

Is a C# struct thread-safe?

For example if there is a:

struct Data
{
    int _number;
    public int Number { get { return _number; } set { _number =         


        
6条回答
  •  无人及你
    2020-12-03 13:12

    No, they are not. I created very simple app to see if 10/10 producer/consumer threads are accessing same struct variable. And eventually you will see Debugger.Break(); will be hit. Bank balance should never go under 0 value.

    namespace StructThreadSafe
    {
        class Program
        {
            struct BankBalance
            {
                public decimal Balance { get; set; }
            }
    
            static void Main(string[] args)
            {
                BankBalance bankBalance = new BankBalance();
                bankBalance.Balance = 100;
                List allTasks = new List();
                for (int q = 0; q < 10; q++)
                {
                    Task producer = new Task(() =>
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            if (bankBalance.Balance < 0)
                            {
                                if (Debugger.IsAttached)
                                {
                                    Debugger.Break();
                                }   
                            }
                            bankBalance.Balance += 5;
                            Console.WriteLine("++Current Balance: " + bankBalance.Balance);
                            System.Threading.Thread.Sleep(100);
                        }
                    });
                    allTasks.Add(producer);
                }
                for (int w = 0; w < 10; w++)
                {
                    Task consumer = new Task(() =>
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            if (bankBalance.Balance < 0)
                            {
                                if (Debugger.IsAttached)
                                {
                                    Debugger.Break();
                                }
                            }
                            if (bankBalance.Balance > 15)
                            {
                                bankBalance.Balance -= 15;
                                Console.WriteLine("--Current Balance: " + bankBalance.Balance);
                            }
                            else
                            {
                                Console.WriteLine("**Current Balance below minimum: " + bankBalance.Balance);
                            }
                            System.Threading.Thread.Sleep(100);
                        }
                    });
                    allTasks.Add(consumer);
                }
                allTasks.ForEach(p => p.Start());
                Task.WaitAll(allTasks.ToArray());
    
            }
        }
    }
    

提交回复
热议问题