C#. Считать значение, используюя класс Interlocked

256
19 декабря 2017, 15:45

Необходимо реализовать доступ (изменение/считывание) из потоков к общей переменной с помощью класса Interlocked. Фрагменты кода: Общая переменная:

string bufferMessage = "None";

Запись в переменную:

Interlocked.Exchange(ref bufferMessage,
                     "Thread #" + threadName + " WRITE message: " + i);

Считывание:

messagesRead.Add("Thread #" + threadName + " READ message: "
                  + Interlocked.Read(ref bufferMessage));

Запись проходит успешно, считывание компилятор не хочет пропускать. Выводит ошибку:

Не удается преобразовать из "ref string" в "ref long"

Есть вообще возможность считывания значения строковой переменной с помощью класса Interlocked?

Answer 1

Метод Read предназначен исключительно для чтения 64-битных чисел(long) на 32-битных системах, так как чтение 64-битного числа на них не является атомарной операцией.
Поэтому как для типа string, так и для других типов double, float и тд в классе Interlocked явной функции чтения не существует.

Спасибо @PetSerAl, как он заметил верно, можно атомарно прочитать значение с помощью метода CompareExchange

Interlocked.CompareExchange(ref bufferMessage, null, null)

Данный метод будет всегда возвращать значение текущей переменной bufferMessage, так как bufferMessage != null(идет сравнение переменной bufferMessage c 3 аргументом функции)

READ ALSO
Windows Forms Designer — плохая практика? [требует правки]

Windows Forms Designer — плохая практика? [требует правки]

Я посмотрел одно видео (лекцию), в котором автор убеждал, что использование дизайнера в Windows Forms -- это очень плохо и вообще дело минувших днейЕсли...

221
screenshot storage API

screenshot storage API

Добрый день! Я пишу автотесты на C# + Selenium и для failed тестов я делаю скриншотыИ вот появилась у меня необходимость хранить эти скриншоты не локально...

219
ASP.Net Core MVC на Ubuntu Server

ASP.Net Core MVC на Ubuntu Server

ЗдравствуйтеИмеется удалённый сервер на Ubuntu Server 16

210
Как обратиться к элементу XAML с помощью C# в WPF приложении?

Как обратиться к элементу XAML с помощью C# в WPF приложении?

Для примера есть 2 кнопки с разным контентом

276