Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 19:06   #1
Comik
Новичок
Джуниор
 
Регистрация: 07.12.2010
Сообщений: 2
По умолчанию InterlockedCompareExchangePointer

Уважаемые форумчане, есть небольшая просьба, нужно сделать маленькую програмку на С++ (в билдере, не консольную), которая должна осуществлять модификацию значений общих переменных используя функции InterlockedCompareExchangePointer() , так чтобы работа функции была наглядной.
Если не сложно, обьяснить как оно должно работать, с живими примерами.
Спасибо)
Comik вне форума Ответить с цитированием
Старый 09.01.2011, 17:51   #2
Comik
Новичок
Джуниор
 
Регистрация: 07.12.2010
Сообщений: 2
По умолчанию

никто не может помочь? или никто не хочет помочь? дайте хоть ссылку на рускоязычный ресурс с описанием функции, буду очень благодарен!
Comik вне форума Ответить с цитированием
Старый 09.01.2011, 18:10   #3
veniside
Старожил
 
Регистрация: 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.
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц