Как организовать доступ двух потоков к общей переменной в C#?

Не будет ли конфликта двух потоков при доступе к переменной str? Нужно предпринимать дополнительные меры?

using System;
using System.Threading;

class Program
{
    static string str = "";  //  общая переменная

    static void Main(string[] args)
    {
        // создаем новый поток 1
        Thread myThread1 = new Thread(Writer1);
        myThread1.Start(); // запускаем поток

        // создаем новый поток 2
        Thread myThread2 = new Thread(Writer2);
        myThread2.Start(); // запускаем поток

        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine($"Thread0 str=: {str}");
            Thread.Sleep(350);
        }

        Console.ReadLine();
    }

    public static void Writer1()
    {
        for (int i = 0; i < 200; i++)
        {
            str = "Written by thread 1";
            Thread.Sleep(300);
        }
    }

    public static void Writer2()
    {
        for (int i = 0; i < 200; i++)
        {
            str = "Written by thread 2";
            Thread.Sleep(400);
        }
    }
}
  • Вопрос задан
  • 991 просмотр
Пригласить эксперта
Ответы на вопрос 3
@none7
В данном конкретном случае, нет. Переменная str это указатель, с точки зрения процессора это примитивный тип данных. Самое страшное, что могло бы произойти это мешанина битов в переменной, но процессор сам разруливает такие ситуации с примитивными типами. Со структурами тот же трюк не пройдёт.
Ответ написан
Комментировать
Чтобы избежать состояния гонки, использовать lock.
В примере стоило бы убрать Thread.Sleep чтобы это проявилось.
Ответ написан
Комментировать
Geronom
@Geronom
C#
Лучше использовать

static readonly object @lock = new object();

lock (@lock)
{
//Stuff
}

И в public static void Writer2() опечатка:

str = "Written by thread 1";

нужно

str = "Written by thread 2";

иначе всегда будет вывод с номер 1 и путаница
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы