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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2012, 20:24   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Критическая секция между потоками на разных ядрах

Собственно, вопрос по сабжу: есть критическая секция и 2 потока, ее использующие в своих методах. Программа зависает в 1 из 100 случаев, но статистика показала - улеты в облака наблюдаются. В коде ошибок нет априори, проверялось многократно, можно принять как факт.
Теперь мысли вслух и вопрос тут же. В случае одного ядра идет четкое попеременное разделение квантов времени между этими 2мя потоками процесса. Т.е. к объекту синхронизации оба потока ОДНОВРЕМЕННО обратиться физически просто не смогут. Но если процессор многоядерный, а при запуске программы винда посчитала распределить эти 2 потока по разным ядрам, то получается этот 1 из 100 случаев: ситуация, когда в одну и ту же единицу времени оба потока обратятся к критической секции, т.е. вызов EnterCriticalSection(FRTL) произойдет одновременно в методах обоих потоков. Как ОС разрешает такой казус? Которому из потов отдается предпочтение? Или же ОС не решает такой задачи, что и приводит к задумчивости программы? Спасет ли форсирование аффинити-маски для этих двух потов и если да, то станет ли это причиной подтормаживания программы при загрузке ЦП другими процессами?
Чтобы было понятнее, скажу сразу: 1 поток постоянно делает что-то, а второй поток обращается к этому чему-то по щелчку пользователя. И вот при одном из таких "удачных" щелчков по контролу интерфейс зависает. Можете прокомментировать эту ситуацию? Прошу помочь в первую очередь знающих и опытных программистов! Заранее спасибо!
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 25.02.2012 в 20:28.
3D Hunter вне форума Ответить с цитированием
Старый 25.02.2012, 20:56   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Может очередь?
Занято? В очередь, пока занято.
Человек_Борща вне форума Ответить с цитированием
Старый 25.02.2012, 21:02   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

А поконкретнее аналогию можно? Имеете ввиду аффинити-маски?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 25.02.2012, 22:03   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Заводим глобальный обьект крит. секции.

Когда потоку надо куда-то обратиться, он апроверяет: Есть ли крит. секция. Если нет, создает свою и вызывает заранее завернутый код.
Если Да, то отправляет в "поток 3" данные. Поток 3 ждет пока крит. секция не освободится, когда это происходит, поток 3 занимает крит. секцию с сбрасывает туда данные(заняв крит. секцию).
Человек_Борща вне форума Ответить с цитированием
Старый 25.02.2012, 22:26   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Т.е. к объекту синхронизации оба потока ОДНОВРЕМЕННО обратиться физически просто не смогут. Но если процессор многоядерный, а при запуске программы винда посчитала распределить эти 2 потока по разным ядрам, то получается этот 1 из 100 случаев: ситуация, когда в одну и ту же единицу времени оба потока обратятся к критической секции, т.е. вызов EnterCriticalSection(FRTL) произойдет одновременно в методах обоих потоков. Как ОС разрешает такой казус? Которому из потов отдается предпочтение? Или же ОС не решает такой задачи, что и приводит к задумчивости программы? Спасет ли форсирование аффинити-маски для этих двух потов и если да, то станет ли это причиной подтормаживания программы при загрузке ЦП другими процессами?
критические секции специально заточены под это. конфликтов не происходит. пусть будет хоть 100 процессоров и по потоку на каждом и все они одновременно обратятся к критической секции, в критическую войдёт только один поток. там куча всяких мелочей, приводить здесь всю матчасть и подноготную операционной системы просто лень.
rpy3uH вне форума Ответить с цитированием
Старый 25.02.2012, 22:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не пойму, зачем создавать еще левые потоки для организации ожидания освобождения крит.секции, если просто в потоке можно ждать этого освобождения? Чем это поможет ТС, если он в двух потоках использует одну критческую секцию? И что-то не слышал про проблемы критических секций для многоядерных процессоров. Скорее всего где-то в код ТС закралась ошибка, хотя он и обратное утверждает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.02.2012, 22:30   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Заводим глобальный обьект крит. секции.

Когда потоку надо куда-то обратиться, он апроверяет: Есть ли крит. секция. Если нет, создает свою и вызывает заранее завернутый код.
Если Да, то отправляет в "поток 3" данные. Поток 3 ждет пока крит. секция не освободится, когда это происходит, поток 3 занимает крит. секцию с сбрасывает туда данные(заняв крит. секцию).
это костыль и изобретение велосипеда. критические секции специально сделаны для того чтобы не делать это. критические секции сделаны для удобства, а не для создания костылей

Последний раз редактировалось rpy3uH; 25.02.2012 в 22:35.
rpy3uH вне форума Ответить с цитированием
Старый 25.02.2012, 22:35   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
вот при одном из таких "удачных" щелчков по контролу интерфейс зависает
То есть gui-поток вызвает EnterCriticalSection, но объект уже занят.
gui-поток сначала покрутится в спин-блокировке, потом уходит в режим ядра.
Из нирваны его выведет освобождение объекта синхронизации. Выводит, но долго ждать? Тогда может TryEnterCriticalSection?
Я так вижу.
EUGY вне форума Ответить с цитированием
Старый 25.02.2012, 22:36   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
gui-поток сначала покрутится в спин-блокировке, потом уходит в режим ядра.
крутиться на спин-блокировке можно только в ядре
rpy3uH вне форума Ответить с цитированием
Старый 25.02.2012, 23:27   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
крутиться на спин-блокировке можно только в ядре
Спасибо, правильно ли я понял: поток в вызове EnterCriticalSection переходит в режим ядра, пытается получить доступ к ресурсу в спин-блокировке. Планировщик потоков переключит контект только после этого.
EUGY вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage между потоками Kamalekb Общие вопросы Delphi 3 20.12.2011 21:53
Потоки. Сообщения между потоками mig_ira Общие вопросы Delphi 10 09.08.2010 17:34
Как грамотно разделить данные между потоками? bagulma Общие вопросы Delphi 5 28.05.2008 22:41