![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| SubZero |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Собственно хотелось бы узнать где можно почитать о данных вопросах. Желательно, чтобы было написано доступным языком. Читал книгу Джеффри Рихтера ("Программирование под Win32") и Джорджа Шеферда ("Программирование на VC++.NET"), но они написаны достаточно трудным для восприятия языком. Заранее спасибо!
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 1 Всего: 196 |
SubZero, если честно я не особо понимаю, зачем что-то нужно читать по этому поводу кроме документации на конкретное API.
Для начала нужно просто представить, как работает многопоточная программа. А работает она параллельно - параллельно исполняется несколько участков кода, которые имеют общий доступ к глобальным переменным. Чтобы создать поток нужно вызвать специальную функцию, передав ей указатель на функцию, которая будет исполняться в новом потоке (при этом, эта функция может вызывать другие функции - ограничений особых нет, вроде). Дальше возникают проблемы одновременного доступа к данным (иногда называют "гонка" или "race condition"). Чтобы их избежать нужна какая-то синхронизация. Для этого придуманы мьютексы. Один поток захватывает мьютекс (lock) и делает какую-то работу, если второй поток попытается в это время захватить тот же мьютекс, то он будет заблокирован до тех пор, пока первый не освободит (unlock) этот мьютекс (надо только следить, чтобы один поток не попытался захватить мьютекс дважды (или косвенный вариант, когда один поток захватывает мьютекс m1, второй поток захватывает мьютекс m2, затем первый поток пытается захватить m2, а второй - m1), так как в этом случа он зависнет). Таким образом организуется синхронизация доступа к общим данным. Есть еще такие вещи как семафоры и еще некоторые функции управления. Но они уже реже используются, поэтому о них можно просто почитать в документации к API, чтобы знать о их существовании, а в момент, когда понядобятся, просто открыть нужную страницу документации. Это сообщение отредактировал(а) bsa - 3.7.2008, 10:49 |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: нет Всего: 3 |
А о том, что написал bsa, можно почитать Таненбаум - Современные операционные системы (2007).
Сам читаю, поэтому рекомендую!!! -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
То что описал bsa это не единственный подход, это то что называется системами с общей памятью. Еще иногда строят программы не на использовании общих ресурсов, а на обмене сообщениями. Каждый объект принадлежит определенному потоку, и вместо того, что-бы вызывать метод этого объекта из другого потока, объекту посылается сообщение, и он выполняет свой метод(обработчик сообщения) в своем потоке. В этом случае не возникает проблем с синхронизацией, так как каждый поток работает со своей копией данных. Программы построенные на обмене сообщениями лучше масштабируются, представьте что в вашей программе есть N потоков использующих общий ресурс, чем больше N, тем дольше потоки будут ждать освобождения ресурса.
Конечно при небольшом количестве потоков, сообщения менее выгодны, так как потоки практически не простаивают, конфликты доступа практически не встречаются. И памяти на сообщения будет использоваться больше, но scaleability у такого решения лучше. |
|||
|
||||
| SubZero |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
Не подскажешь где скачать электронную версию? Добавлено через 2 минуты и 18 секунд
bsa, спасибо тебе огромное за помощь! Пишу на VC++ 2003, где можно будеть почитать про необходимые функции API на русском языке? |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 1 Всего: 196 |
Тебе в раздел про WinAPI32 |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: нет Всего: 3 |
-------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 1 Всего: 207 |
самый высокопроизводительный способ взаимодействия потоков - общая память при грамотном применении неблокирующих блокировок и эффективного конечного автомата производительность будет максимальной не в ущерб масштабируемости -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
||||
|
||||
| sparn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 11.5.2006 Репутация: нет Всего: 1 |
Осмелюсь предположить, что имелись ввиду такие блокировки памяти которые не останавливают выполнение потока, т.е. поток узнаёт что данная область памяти занята другим потоком и не ждёт её освобождения, а идёт заниматься другими делами. Под ос Windows такое реализуется с помощью WaitForSingleObject со временем ожидания заданным в 0 ( WaitForSingleObject(synchronizationObject, 0); ), либо TryEnterCriticalSection вместо EnterCriticalSection. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |