Реализация многопоточности в MFC для обновления внутреннего словаря, доступного внешним функциям - PullRequest
0 голосов
/ 20 декабря 2011

Я работаю с C ++ и MFC над созданием приложения, которое будет извлекать информацию из Bloomberg в режиме реального времени.Bloomberg API имеет класс подписки, который будет «подписываться» на обновления от Bloomberg и отправлять их на мой компьютер в режиме реального времени, поэтому мне нужно запустить цикл обработки событий в потоке для обработки данных Bloomberg.

ЧтобыЧтобы сохранить пропускную способность, я хочу использовать словарь для сопоставления тикера Bloomberg с его последней ценой, поэтому вместо получения нескольких результатов для одного и того же тикера (т. е. у меня один и тот же тикер несколько раз), программа выполнит поиск втолковый словарь.Таким образом, мне нужно подписаться только на разные тикеры.

Я не работал с многопоточностью раньше, и я читал документацию в MSDN, но у меня много проблем с пониманием того, что мне нужноdo.

Исходя из моего понимания, мне нужно создать рабочий поток с помощью AfxBeginThread () и передать указатель на экземпляр словаря.Рабочий поток будет обновлять словарь, пока работает остальная часть моей программы.

Этот словарь заблокирован потоком?Могу ли я безопасно получить к нему доступ во время его обновления?

Могу ли я просто оставить поток работающим в фоновом режиме до завершения программы?Нужно ли мне явно уничтожать поток, когда я завершаю программу, или это будет сделано автоматически?

Это звучит правильно, или я упускаю что-то фундаментальное?

Итак, я создалCMap (CString, LPCSTR, double, double) для хранения тикеров и цен.Я передаю указатель на CMap через LPVOID, и CMap обновляется в режиме реального времени.Это все работает сейчас.Я могу искать переменные в CMap и получать цены в режиме реального времени.

Однако, сейчас, это не "потокобезопасно".Есть только один поток, который когда-либо пишет в CMap, а все остальное просто читает данные в CMap, так что на данный момент это не имеет большого значения.

Однако, в интересах изучения хороших практик программирования,Я должен использовать CEvent при записи в CMap?CEvent должен быть передан в поток?Я не уверен, как это реализовано.Я сделал быстрый поиск в Google, и я не нашел ничего, что я понял о том, как заблокировать и разблокировать переменную в потоке.

1 Ответ

1 голос
/ 20 декабря 2011

Любые объекты, которые специально не предназначены для обеспечения безопасности потоков, не являются такими. Поэтому вам понадобятся некоторые объекты мьютекса, защищающие доступ к вашему «словарю»:

// for example, HINT CCriticalSection, or CSemaphore
mutex.lock();
dictionary.add(...);
mutex.unlock();

В то время как документация предполагает CSemaphore в вышеприведенном случае, CCriticalSection (на мой взгляд) легче понять для начинающего.

Потоки, которые запускает ваше приложение, должны быть остановлены вашим приложением, да. Вы можете сделать это, сообщив потоку, что работа завершена:

// for example, HINT CEvent
while(!stopped)
{
   do_work();
}

И установить остановленное событие при выходе из приложения.

Для начала прочитайте здесь . Честно говоря, хотя это довольно простые вопросы, так что будьте готовы потратить время на изучение этого материала. Если бы написать соответствующий многопоточный код было легко, каждый бы это сделал.

Что касается конкретных упомянутых классов синхронизации, они задокументированы здесь .

...