![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с HT
_Sergey_ © (2006-09-18 13:34:00)Здравствуйте.
Я написал консольное клиент-серверное приложение на 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 программа может работать в условиях тестирования сутки, и ни одной ошибки не возникает.
В своей программе я не использую ф-ий работы с многопроцессорными системами. Более того, можно подумать, что я неправильно синхронизирую потоки, и такая синхронизация "проходит" на однопроцессорной системе, но не "проходит" на многопроцессорной. Но у меня и поток один. Нечего там синхронизировать.
_Sergey_ (2006-09-20 12:26:00) [1]Используется 1 поток, блокирующие сокеты, все ф-ии - WinSock 1.1, callback-функции не используются, overlapped не используется. Более подробно о моем приложении и принципах его реализации Вы можете прочитать здесь:
http://delphimaster.ru/cgi-bin/forum.pl?id=1157482660&n=4
guav (2006-09-19 22:25:00) [2]> Но у меня и поток один. Нечего там синхронизировать.
В некоторые функций WSA передаётся адрес callback-функции в качестве параметра (это WSAAccept и overlapped-версии WSASend, WSASendTo, WSARecv, WSARecvFrom) , если какая-то часть пользовательского кода могла "попасть в другой поток", то это callback-функции; в них и стоит проверить GetCurrentThreadId, совпадает ли она с первичной нитью.
Если callback-функции имеются действительно вызываются в другом потоке, то важной частью межпоточной синхронизации будет установка переменной IsMultiThread в True.
Вообще, какой режим сокетов используется, используется ли overlapped ?
_Sergey_ (2006-09-19 21:41:00) [3]Спасибо. Действительно, моя программа использует только 1 поток, в то время, как в диспетчере задач их отображается 2 шт. Но, как я понял, к этому потоку я доступа не имею. Как тогда осуществлять синхронизацию?
Интересная информация:
при включенном HT под Win2k Pro SP4 Rus и Windows 2003 Server Standard Edition Rus в тех же условиях тестирования (кроме ОС, конечно), на том же железе никаких ошибок не возникало. Похоже, это проблемки с WinXP Pro SP2. Но как там синхронизировать потоки, если второй поток - не мой?
Rouse_ (2006-09-18 14:20:00) [4]В NT (про другие не знаю) для работы с сокетом запускается дополнительный поток.
Запускается автоматом при инициализации Windows Sockets service provider,
с которым будет потом работать клиент.
И как не странно этот поток принадлежит твоему процессу :)
Игорь Шевченко (2006-09-18 13:57:00) [5]
> Что посоветуете, какие мысли по поводу вышеизложенного?
Программу отлаживать. Очевидно, неверная синхронизация потоков