Форум: "WinAPI";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизПроблема с HT Найти похожие ветки
← →
_Sergey_ © (2006-09-18 13:34) [0]Здравствуйте.
Я написал консольное клиент-серверное приложение на D7. Использовал такие юниты: SysUtils, WinSock, Windows, Classes.
При этом при включенном HT, запущенных 39 клиентах и 1-м сервере с периодичностью в 15 мин. клиенты "вываливаются" с MessageBox-ами с сообщениями об ошибках работы с памятью, причем с разными адресами. Примеры:
;-------
Инструкция по адресу "0x00140190" обратилась к памяти по адресу "0x98449844". Память не может быть "written".
"OK" -- завершение приложения
;-------
Инструкция по адресу "0x77f745cc" обратилась к памяти по адресу "0xffffffff". Память не может быть "read". "OK" -- завершение приложения
;-------
Инструкция по адресу "0x00140199" обратилась к памяти по адресу "0x00002930". Память не может быть "written".
"OK" -- завершение приложения
;-------
Инструкция по адресу "0x77f745cc" обратилась к памяти по адресу "0x00000007". Память не может быть "written".
"OK" -- завершение приложения
;-------
Инструкция по адресу "0x00000000" обратилась к памяти по адресу "0x00000000". Память не может быть "read". "OK" -- завершение приложения
;-------
Причем частота появления ошибок увеличивается при активном параллельном использовании "тяжелых" сторонних программ во время проведения теста (Photoshop, FineReader, ...), особенно при их запуске/завершении.
Использование SetThreadAffinityMask не помогло. Привязал всех клиентов на машинке с P4 3.0 GHz HT к 0-му процессору командой SetThreadAffinityMask(GetCurrentThread, 1). ОС - WinXP Pro SP2. Результат тот же.
Перезагружаю машинку, выключаю в BIOS-е HT, провожу тот же тест - никаких сообщений об ошибках. Все чисто. Что посоветуете, какие мысли по поводу вышеизложенного?
P.S>
- при включенном HT тестирование приводит к вышеуказанным ошибкам;
- при выключенном HT программа может работать в условиях тестирования сутки, и ни одной ошибки не возникает.
В своей программе я не использую ф-ий работы с многопроцессорными системами. Более того, можно подумать, что я неправильно синхронизирую потоки, и такая синхронизация "проходит" на однопроцессорной системе, но не "проходит" на многопроцессорной. Но у меня и поток один. Нечего там синхронизировать.
← →
Игорь Шевченко © (2006-09-18 13:57) [1]
> Что посоветуете, какие мысли по поводу вышеизложенного?
Программу отлаживать. Очевидно, неверная синхронизация потоков
← →
Rouse_ © (2006-09-18 14:20) [2]В NT (про другие не знаю) для работы с сокетом запускается дополнительный поток.
Запускается автоматом при инициализации Windows Sockets service provider,
с которым будет потом работать клиент.
И как не странно этот поток принадлежит твоему процессу :)
← →
_Sergey_ © (2006-09-19 21:41) [3]Спасибо. Действительно, моя программа использует только 1 поток, в то время, как в диспетчере задач их отображается 2 шт. Но, как я понял, к этому потоку я доступа не имею. Как тогда осуществлять синхронизацию?
Интересная информация:
при включенном HT под Win2k Pro SP4 Rus и Windows 2003 Server Standard Edition Rus в тех же условиях тестирования (кроме ОС, конечно), на том же железе никаких ошибок не возникало. Похоже, это проблемки с WinXP Pro SP2. Но как там синхронизировать потоки, если второй поток - не мой?
← →
guav © (2006-09-19 22:25) [4]> Но у меня и поток один. Нечего там синхронизировать.
В некоторые функций WSA передаётся адрес callback-функции в качестве параметра (это WSAAccept и overlapped-версии WSASend, WSASendTo, WSARecv, WSARecvFrom) , если какая-то часть пользовательского кода могла "попасть в другой поток", то это callback-функции; в них и стоит проверить GetCurrentThreadId, совпадает ли она с первичной нитью.
Если callback-функции имеются действительно вызываются в другом потоке, то важной частью межпоточной синхронизации будет установка переменной IsMultiThread в True.
Вообще, какой режим сокетов используется, используется ли overlapped ?
← →
_Sergey_ © (2006-09-20 12:26) [5]Используется 1 поток, блокирующие сокеты, все ф-ии - WinSock 1.1, callback-функции не используются, overlapped не используется. Более подробно о моем приложении и принципах его реализации Вы можете прочитать здесь:
http://delphimaster.net/view/6-1157482660/
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c