Использование множеств в многопоточном приложении
От: Аноним  
Дата: 08.11.10 07:26
Оценка:
Есть множество

[Flags]
public enum MySet{None=0,Val1=1,Val1=2,Val3=4}

И нужны функции которые будут работать в многопоточном коде. Вот они
private MySet mySet;
public bool IsSet(MySet s)
{
 return mySet & s == s;
}
public void OnSet(MySet s)
{
 mySet += s;
}

public void OfSet(MySet s)
{
 mySet -= s;
}


Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?
Re: Использование множеств в многопоточном приложении
От: _FRED_ Черногория
Дата: 08.11.10 07:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть множество


А>И нужны функции которые будут работать в многопоточном коде. Вот они

А>Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?

Нужно использовать тег [c#], битовые опрерации сложения и умножения и, например, lock.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Использование множеств в многопоточном приложении
От: Аноним  
Дата: 08.11.10 07:42
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>>Есть множество

_FR>…
А>>И нужны функции которые будут работать в многопоточном коде. Вот они
_FR>…
А>>Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?

_FR>Нужно использовать тег [c#], битовые опрерации сложения и умножения и, например, lock.


Извините за наглость, а код не покажете? Только начинаю писать и не хочется на грабли наступать в такой мелочи
Re[3]: Использование множеств в многопоточном приложении
От: _FRED_ Черногория
Дата: 08.11.10 07:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Есть множество

_FR>>…
А>>>И нужны функции которые будут работать в многопоточном коде. Вот они
_FR>>…
А>>>Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?
_FR>>Нужно использовать тег [c#], битовые опрерации сложения и умножения и, например, lock.

А>Извините за наглость, а код не покажете? Только начинаю писать и не хочется на грабли наступать в такой мелочи


Типы перечислений (руководство по программированию в C#)
lock Statement (C# Reference)
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Использование множеств в многопоточном приложении
От: Аноним  
Дата: 08.11.10 07:51
Оценка:
А>>Извините за наглость, а код не покажете? Только начинаю писать и не хочется на грабли наступать в такой мелочи

_FR>Типы перечислений (руководство по программированию в C#)

_FR>lock Statement (C# Reference)

Спасибо. А подскажите. Есть я делаю Read-Only свойство то в методе get мне надо использовать lock?
Re[5]: Использование множеств в многопоточном приложении
От: _FRED_ Черногория
Дата: 08.11.10 07:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Извините за наглость, а код не покажете? Только начинаю писать и не хочется на грабли наступать в такой мелочи


_FR>>Типы перечислений (руководство по программированию в C#)

_FR>>lock Statement (C# Reference)

А>Спасибо. А подскажите. Есть я делаю Read-Only свойство то в методе get мне надо использовать lock?


Это зависит от того, как реализовано get. Что бы лишний раз не думать, можно и залочить.
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Использование множеств в многопоточном приложении
От: Аноним  
Дата: 08.11.10 08:12
Оценка:
_FR>Это зависит от того, как реализовано get. Что бы лишний раз не думать, можно и залочить.
Понял. А если я просто читаю поле (не свойство) то его не нужно лочить?
Re[7]: Использование множеств в многопоточном приложении
От: TK Лес кывт.рф
Дата: 08.11.10 09:30
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>Это зависит от того, как реализовано get. Что бы лишний раз не думать, можно и залочить.

А>Понял. А если я просто читаю поле (не свойство) то его не нужно лочить?

В случае с вашим кодом (использование enum) можно использовать Interlocked операции для записи изменений и обычное чтение без дополнительных блокировок.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[7]: Использование множеств в многопоточном приложении
От: Jolly Roger  
Дата: 08.11.10 09:34
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Понял. А если я просто читаю поле (не свойство) то его не нужно лочить?


Если его размер равен 4-м байт(как в Вашем примере), то не нужно. Даже если кто-то будет его писать в этот момент, ничего страшного не произойдёт. Стоит только пометить переменную как volatile.
"Нормальные герои всегда идут в обход!"
Re: Использование множеств в многопоточном приложении
От: Lloyd Россия  
Дата: 08.11.10 09:37
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?


Метод IsSet — потокобезопасен, т.к. там присутствует только одно чтение, а оно безопасно.

Методы OnSet, OfSet — непотокобезопасны, т.к. там присутствует как чтение, так и запись и между ними может вклиниться другой поток. Поэтому, тело метода луче обрамить в lock(_lock), а _lock нужно объявить членом класса (private readonly object _lock = new object().
Сами методы OnSet, OfSet реализованы неправильно, для манипуляции flag-ами нужно использовать битовые операции.
Re[8]: Использование множеств в многопоточном приложении
От: _FRED_ Черногория
Дата: 08.11.10 09:41
Оценка: +1
Здравствуйте, TK, Вы писали:

_FR>>>Это зависит от того, как реализовано get. Что бы лишний раз не думать, можно и залочить.

А>>Понял. А если я просто читаю поле (не свойство) то его не нужно лочить?
TK>В случае с вашим кодом (использование enum) можно использовать Interlocked операции для записи изменений и обычное чтение без дополнительных блокировок.

А разве можно на Interlocked сделать добавление/удаление флага?
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Использование множеств в многопоточном приложении
От: Lloyd Россия  
Дата: 08.11.10 09:42
Оценка:
Здравствуйте, TK, Вы писали:

А>>Понял. А если я просто читаю поле (не свойство) то его не нужно лочить?


TK>В случае с вашим кодом (использование enum) можно использовать Interlocked операции для записи изменений и обычное чтение без дополнительных блокировок.


А можно пример использоания interlocked в применении к данному случаю?
Re[2]: Использование множеств в многопоточном приложении
От: _FRED_ Черногория
Дата: 08.11.10 09:56
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

А>>Как такое сделать в многопоточной среде? Или можно оставить так и проблем не будет?

L>Метод IsSet — потокобезопасен, т.к. там присутствует только одно чтение, а оно безопасно.

А если у енама underlying-тип — восьмибайтный, тоже будет "безопасно"?
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Использование множеств в многопоточном приложении
От: Lloyd Россия  
Дата: 08.11.10 10:02
Оценка:
Здравствуйте, _FRED_, Вы писали:

L>>Метод IsSet — потокобезопасен, т.к. там присутствует только одно чтение, а оно безопасно.


_FR>А если у енама underlying-тип — восьмибайтный, тоже будет "безопасно"?


А где ты нашел восьмибайтный enum?
Re[3]: Использование множеств в многопоточном приложении
От: Jolly Roger  
Дата: 08.11.10 10:07
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А если у енама underlying-тип — восьмибайтный, тоже будет "безопасно"?

+1

И даже если 4-хбайтный, но не выровнен на границу (нарпимер при Pack == 1), то тоже может оказаться непотокобезопасным.
"Нормальные герои всегда идут в обход!"
Re[4]: Использование множеств в многопоточном приложении
От: Jolly Roger  
Дата: 08.11.10 10:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А где ты нашел восьмибайтный enum?


enum MyEnum: long

"Нормальные герои всегда идут в обход!"
Re[9]: Использование множеств в многопоточном приложении
От: Jolly Roger  
Дата: 08.11.10 10:09
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А разве можно на Interlocked сделать добавление/удаление флага?


Можно с применением Interlocked.CompareExchange
"Нормальные герои всегда идут в обход!"
Re[5]: Использование множеств в многопоточном приложении
От: Lloyd Россия  
Дата: 08.11.10 10:12
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>А где ты нашел восьмибайтный enum?


JR>
JR>enum MyEnum: long
JR>

JR>

И где ты это нашел?
Re[6]: Использование множеств в многопоточном приложении
От: Jolly Roger  
Дата: 08.11.10 10:17
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>И где ты это нашел?


В смысле? Если Вы имеете в виду приведённый ТС пример, то ведь очевидно, что это просто демонстрация вопроса. Просто утверждение

Метод IsSet — потокобезопасен, т.к. там присутствует только одно чтение, а оно безопасно.

слишком жёстко на мой взгляд, так как его справедливость зависит от ряда дополнительных, неоговоренных условий.
"Нормальные герои всегда идут в обход!"
Re[7]: Использование множеств в многопоточном приложении
От: Lloyd Россия  
Дата: 08.11.10 10:24
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Просто утверждение


JR>

JR>Метод IsSet — потокобезопасен, т.к. там присутствует только одно чтение, а оно безопасно.

JR>слишком жёстко на мой взгляд, так как его справедливость зависит от ряда дополнительных, неоговоренных условий.

Я даже более скажу, любое утвердение без контекста теряет смысл. А контекст определен топиком.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.