|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.12.2010, 19:06 | #1 |
Новичок
Джуниор
Регистрация: 07.12.2010
Сообщений: 2
|
InterlockedCompareExchangePointer
Уважаемые форумчане, есть небольшая просьба, нужно сделать маленькую програмку на С++ (в билдере, не консольную), которая должна осуществлять модификацию значений общих переменных используя функции InterlockedCompareExchangePointer() , так чтобы работа функции была наглядной.
Если не сложно, обьяснить как оно должно работать, с живими примерами. Спасибо) |
09.01.2011, 17:51 | #2 |
Новичок
Джуниор
Регистрация: 07.12.2010
Сообщений: 2
|
никто не может помочь? или никто не хочет помочь? дайте хоть ссылку на рускоязычный ресурс с описанием функции, буду очень благодарен!
|
09.01.2011, 18:10 | #3 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Вобще-то для переменных обычно используют InterlockedCompareExchange(), но работают они одинаково: есть некая переменная, значение которой нужно изменить, но только в том случае, если оно равно другому значению (обычно 0, но не обязятельно). Так вот, InterlockedCompareExchange(D, E, C) сравнивает значение D и С, и если они равны (на момент сравнения), то в D записывается E. Если не равны, то D не изменяется. В любом случае функция возвращает значение, которое было в D до вызова. Фишка в том, что все эти сравнения и присваивания выполняются атомарно одной ассемблерной командой с захватом шины, чтобы только один поток мог выполнить весь этот набор за раз.
Зачем это нужно? Допустим, нам нужно захватить некий ресурс. D у нас будет флагом, пока D равно 0, ресурс не занят. Теперь два (или больше) потоков приходят в точку захвата, и вызывают: первый поток: W = InterlockedCompareExchange(D, 1, 0); второй поток: W = InterlockedCompareExchange(D, 2, 0); Потоков может быть сколько угодно, но только у одного из них W станет равно 0. Он и захватит ресурс. Все остальные потоки получат W равное индексу того потока, который захватил ресурс, и будут пробовать захватить его позже. Вот и всё, никаких критических секций, проверки дедлоков и прочей возни. А чтобы было наглядно, запусти 30 потоков и посмотри, как они будут драться за доступ к D. Да, чтобы освободить ресурс, достаточно в D записать 0. Можно вести статистику, сколько раз каждый поток пробовал захват, сколько времени работал с ресурсом, сколько времени ждал, какой поток получал ресурс чаще других... да много чего. И выводить это раз в 5 секунд на консоль.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 09.01.2011 в 18:20. |