Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ? / 7 сообщений из 7, страница 1 из 1
20.11.2013, 17:51
    #38471632
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
Привет.
Подскажите как лучше решить такую задачу.

Имеется 2 потока (обычный Thread - ибо у меня .NET 3.5)
1. раз в 10 сек изменяет общую Nullable_Bool переменную.
2. Раз в 60 сек должен считывать эту переменную.

Т.е. два разных потока делают свою работу, но один из потоков должен отчитываться о некоем состоянии перед вторым потоком.

Nullable, чтобы избежать момента, когда второй поток попытается считать переменную раньше, чем ее задали. Тут проблема в том, что не поможет, к примеру, установить изначально False - не ясно, то ли этот False по умолчанию, то ли его уже поменял первый поток. Поэтому и решил использовать Nullable.

Как лучше это все организовать ?
1. В идеале бы было использовать interlocked класс. Но не пойму, как с его помощью считать состояние переменной Bool? не заменяя (мне не нужно Exchange).

2. Есть еще какой то класс Volatile у которого есть методы Read и Write с типом <T>, может он подойдет ?

Как бы реализовать ?
...
Рейтинг: 0 / 0
20.11.2013, 18:21
    #38471695
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
MsSql_Studyобычный Thread - ибо у меня .NET 3.5
Вы так хвалитесь? TPL есть для 3.5

MsSql_StudyИмеется 2 потока
Вот и не парьтесь. Один читающий, второй пишущий. Никакой синхронизации не нужно.

MsSql_StudyНо не пойму, как с его помощью считать состояние переменной Bool? не заменяя (мне не нужно Exchange)
сравнение без замены - CompareExchange

Interlocked.CompareExchange(ref _threadFlag, 0, 0) - сравниваем с нулем, при равенстве заменяем на ноль. Иными словами, хоть обмен значениями есть, логически - его нет.

PS Присвоение bool, кажется, как и других примитивных типов вплоть до int, атомарно.
...
Рейтинг: 0 / 0
20.11.2013, 18:25
    #38471702
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
12.5 Atomicity of variable references
Reads and writes of the following data types shall be atomic: bool, char, byte, sbyte, short, ushort,
uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type
in the previous list shall also be atomic. Reads and writes of other types, including long, ulong, double,
and decimal, as well as user-defined types, need not be atomic. Aside from the library functions designed
for that purpose, there is no guarantee of atomic read-modify-write, such as in the case of increment or
decrement
...
Рейтинг: 0 / 0
20.11.2013, 18:40
    #38471739
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
Arm79,

Спасибо.
Я не хвалюсь, думал, что TPL появился только в 4.0.

Вот только вы упустили из виду, что мне все же нужно не bool, а Nullable_bool - чтобы защитится от ситуации, когда второй поток считает ДО того как значение установят.

Спасибо за подсказку, как CompareExchange, о таком лайфхаке не подумал :)

Вопрос тогда такой. Есть перегрузка метода, принимающая Object - как вы думаете она подойдет для "Bool?" ? По идее, если бы передавался обычный bool, то могли бы быть проблемы с Boxing'ом мне кажется. Но Nullable и сам является классом.
Как думаете, CompareExchange корректно обработает проверку на равенство для "bool?".

Просто не хочется накосячить в многопоточном коде с общими переменными, потом проблем не оберешься при поиске фантомных ошибок из-за неправильной синхронизации. С этим надо быть крайне осторожным.
...
Рейтинг: 0 / 0
20.11.2013, 18:43
    #38471747
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
О каком TPL Для .NET 3.5 вы говорите ?

Странно, но MSDN утверждает что он родом из 4.0
http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx

Хотя может вы имели ввиду то, что до того как стать TPL Эта библиотека называлась по другому и располагалась на codeplex кажется.
Не хотелось бы использовать сильно устаревшие и не поддерживаемые либы :) Уж лучше Thread.
...
Рейтинг: 0 / 0
20.11.2013, 18:52
    #38471768
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
MsSql_StudyО каком TPL Для .NET 3.5 вы говорите ?
Google в помощь , первая же ссылка.

MsSql_StudyВот только вы упустили из виду, что мне все же нужно не bool, а Nullable_bool - чтобы защитится от ситуации, когда второй поток считает ДО того как значение установят.
Вот только вы упустили из виду, что "Reads and writes of the following data types shall be atomic: bool". Читающий поток ВСЕГДА сможет прочесть значение. Пишущий поток ВСЕГДА может записать значение. Для bool синхронизация не нужна. Object - это reference type, для него чтение и запись тоже атомарны.

Мне кажется, вы уперлись в какой то бул зря. Почему именно логический тип? Почему не int с гарантированной атомарностью, да еще и через Interlocked?
...
Рейтинг: 0 / 0
20.11.2013, 19:08
    #38471797
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ?
Вы пожалуй сильно правы. Лучше перейти на Int.

У меня состояние может принимать только 2 состояния :) Поэтому и Bool.
А чтобы защитится от неопределенности что значение проинициализированно, решил использовать Nullable.

Пожалуй Int действительно все эти проблемы уберет, а благодаря именованным константам читабельность даже улучшится.
Так и сделаю.

Спасибо. Действительно уперся в bool я зря. Стоило о других решениях подумать :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В 2х потоках нужно читать/писать одну переменную. Какой подход лучше ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]