Вопрос по архитектуре библиотеки

Вопрос по архитектуре библиотеки
Atom
2/28/2011


Добрый день.

Предположим, что необходимо получать данные по инструментам, для этого мы добавляем нужные столбцы в квике и в программе, подписываемся на событие новой записи и изменения данных в таблице Secirities и в обработчике Trader.Connected запускаем экспорт по DDE этой таблицы.
Данные поступают, мы их видим как в обработчиках событий, так и в таблице Trader.Securities. Далее есть два варианта:
1. в любой момент времени мы можем обратиться к данной таблице из кода стратегии и прочитать нужные нам данные;
2. в обработчиках событий копировать поступившие данные в свои структуры и в стратегии работать со своими данными.

Интересует такой вот момент, во втором случае разработчик сам занимается вопросом согласованности данных, т.е. любая запись и доступ к данным заключены в блок синхронизации и в любой момент времени данные у нас согласованы. Каким образом обстоит дело в первом случае?

Tags:


Thanks:


1 2  >
Mikhail Sukhov

Avatar
Date: 2/28/2011
Reply


esper Go to
т.е. любая запись и доступ к данным заключены в блок синхронизации и в любой момент времени данные у нас согласованы.


Это не так. Объекты торговых типов обновляются без какой-либо синхронизации, и не атомарно.
Thanks:

esper

Avatar
Date: 3/1/2011
Reply


Mikhail Sukhov Go to
Это не так. Объекты торговых типов обновляются без какой-либо синхронизации, и не атомарно.


Т.о. получается, что когда я в событии изменения записи таблицы (SecurityChanged) копирую данные из пришедшего объекта в свою внутреннюю структуру они могут поменяться? Может имеет смысл добавить хотя SyncRoot для возможности lock-а или сделать по принципу много читателей - один писатель?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


esper Go to
Mikhail Sukhov Go to
Это не так. Объекты торговых типов обновляются без какой-либо синхронизации, и не атомарно.


Т.о. получается, что когда я в событии изменения записи таблицы (SecurityChanged) копирую данные из пришедшего объекта в свою внутреннюю структуру они могут поменяться? Может имеет смысл добавить хотя SyncRoot для возможности lock-а или сделать по принципу много читателей - один писатель?


А зачем?
Thanks:

Maxim

Avatar
Date: 3/1/2011
Reply


Мне кажется вы друг друга недопонимаете.

На мой взгляд, esper хотел спросить: являются ли свойства объекта класса QuikTrader потокобезопасными?
И насколько я знаю, ответ: да, являются.

Михаил, поправьте меня, если я ошибаюсь.


Попутный уточняющий вопрос:
а все ли свойства потокобезопасны?
В частности интересует свойство Security.ExtensionInfo
Необходима ли синхронизация этого свойства при доступе из разных потоков?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


Maxim Go to
В частности интересует свойство Security.ExtensionInfo
Необходима ли синхронизация этого свойства при доступе из разных потоков?


Смотря что Вы с ним хотите делать. Если просто сделать так
Code
var info = sec.ExtensionInfo;
, а если
Code
sec.ExtensionInfo.Contains(key);
то да.
Thanks:

esper

Avatar
Date: 3/1/2011
Reply


Mikhail Sukhov Go to
А зачем?


К примеру, у меня стратегия крутится в другом потоке, на каждой итерации ей нужны данные из таблицы инструментов. Получение данных из таблицы осуществляется не в одном месте, а рассредоточено по всей функции стратегии. Я считываю одно поле для конкретного инструмента в начале функции, далее выполняю другие действия, из квика приходят новые данные, считываю другое поле для этого же инструмента и получаю несогласованные данные.

Mikhail Sukhov Go to
Смотря что Вы с ним хотите делать. Если просто сделать так
Code
var info = sec.ExtensionInfo;
, а если
Code
sec.ExtensionInfo.Contains(key);
то да.


Почему в первом случае нет необходимости в синхронизации? ExtensionInfo вроде ссылочный тип, при таком присваивании данные не копируются, просто получаем еще один указатель на словарь[confused]
Thanks:

Maxim

Avatar
Date: 3/1/2011
Reply


Mikhail Sukhov Go to

Смотря что Вы с ним хотите делать. Если просто сделать так
Code
var info = sec.ExtensionInfo;
, а если
Code
sec.ExtensionInfo.Contains(key);
то да.



Ваш ответ к сожалению совсем не понял, так как синхронизация предполагает
доступ из разных потоков. В Вашем примере не ясно какие потоки одновременно могут
обратится к свойству.


Я хочу в одном потоке записывать в это свойство данные, а в другом потоке читать эти данные.
Необходимо ли синхронизовать эти потоки, что бы они одновременно не имели доступ к этому свойству?
Или эта синхронизация реализована внутри свойства?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


Maxim Go to

Я хочу в одном потоке записывать в это свойство данные, а в другом потоке читать эти данные.
Необходимо ли синхронизовать эти потоки, что бы они одновременно не имели доступ к этому свойству?
Или эта синхронизация реализована внутри свойства?


Да, нужно. Это вариант 2.
Thanks:

esper

Avatar
Date: 3/1/2011
Reply


Mikhail Sukhov Go to
Maxim Go to

Я хочу в одном потоке записывать в это свойство данные, а в другом потоке читать эти данные.
Необходимо ли синхронизовать эти потоки, что бы они одновременно не имели доступ к этому свойству?
Или эта синхронизация реализована внутри свойства?


Да, нужно. Это вариант 2.


А каким образом можно сделать синхронизацию с внутренним обновлением этих данных? Чтобы пока я их читаю они не менялись?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


esper Go to
А каким образом можно сделать синхронизацию с внутренним обновлением этих данных? Чтобы пока я их читаю они не менялись?


Наверное никак, так как никакой синхронизации в обновлении данных нет. А в чем заключается сама задача?
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy