|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.02.2012, 20:24 | #1 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Критическая секция между потоками на разных ядрах
Собственно, вопрос по сабжу: есть критическая секция и 2 потока, ее использующие в своих методах. Программа зависает в 1 из 100 случаев, но статистика показала - улеты в облака наблюдаются. В коде ошибок нет априори, проверялось многократно, можно принять как факт.
Теперь мысли вслух и вопрос тут же. В случае одного ядра идет четкое попеременное разделение квантов времени между этими 2мя потоками процесса. Т.е. к объекту синхронизации оба потока ОДНОВРЕМЕННО обратиться физически просто не смогут. Но если процессор многоядерный, а при запуске программы винда посчитала распределить эти 2 потока по разным ядрам, то получается этот 1 из 100 случаев: ситуация, когда в одну и ту же единицу времени оба потока обратятся к критической секции, т.е. вызов EnterCriticalSection(FRTL) произойдет одновременно в методах обоих потоков. Как ОС разрешает такой казус? Которому из потов отдается предпочтение? Или же ОС не решает такой задачи, что и приводит к задумчивости программы? Спасет ли форсирование аффинити-маски для этих двух потов и если да, то станет ли это причиной подтормаживания программы при загрузке ЦП другими процессами? Чтобы было понятнее, скажу сразу: 1 поток постоянно делает что-то, а второй поток обращается к этому чему-то по щелчку пользователя. И вот при одном из таких "удачных" щелчков по контролу интерфейс зависает. Можете прокомментировать эту ситуацию? Прошу помочь в первую очередь знающих и опытных программистов! Заранее спасибо!
"ковыряю изнутри" (с)
Последний раз редактировалось 3D Hunter; 25.02.2012 в 20:28. |
25.02.2012, 20:56 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Может очередь?
Занято? В очередь, пока занято. |
25.02.2012, 21:02 | #3 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
А поконкретнее аналогию можно? Имеете ввиду аффинити-маски?
"ковыряю изнутри" (с)
|
25.02.2012, 22:03 | #4 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Заводим глобальный обьект крит. секции.
Когда потоку надо куда-то обратиться, он апроверяет: Есть ли крит. секция. Если нет, создает свою и вызывает заранее завернутый код. Если Да, то отправляет в "поток 3" данные. Поток 3 ждет пока крит. секция не освободится, когда это происходит, поток 3 занимает крит. секцию с сбрасывает туда данные(заняв крит. секцию). |
25.02.2012, 22:26 | #5 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
|
|
25.02.2012, 22:28 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Не пойму, зачем создавать еще левые потоки для организации ожидания освобождения крит.секции, если просто в потоке можно ждать этого освобождения? Чем это поможет ТС, если он в двух потоках использует одну критческую секцию? И что-то не слышал про проблемы критических секций для многоядерных процессоров. Скорее всего где-то в код ТС закралась ошибка, хотя он и обратное утверждает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
25.02.2012, 22:30 | #7 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
Последний раз редактировалось rpy3uH; 25.02.2012 в 22:35. |
|
25.02.2012, 22:35 | #8 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Цитата:
gui-поток сначала покрутится в спин-блокировке, потом уходит в режим ядра. Из нирваны его выведет освобождение объекта синхронизации. Выводит, но долго ждать? Тогда может TryEnterCriticalSection? Я так вижу. |
|
25.02.2012, 22:36 | #9 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
крутиться на спин-блокировке можно только в ядре
|
25.02.2012, 23:27 | #10 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |