Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > [WinAPI] управление памятью и обмен данными |
Автор: anatox91 12.10.2010, 13:26 | ||||
всем привет у меня в лабе стоит такая задача:
я вот набросал кое-что:
но программа вылетает то ли после создания процесса, то ли после первого выделения памяти... что тут не так? |
Автор: GremlinProg 12.10.2010, 13:44 | ||
видимо, надо захватить мьютекс, чтобы lab5_memsort.exe не успел это сделать первым (если он конечно это делает):
|
Автор: anatox91 12.10.2010, 13:48 |
ээ спасибо, я как раз не мог понять для чего этот параметр)) но проблему вылета это не решило, вылетает где-то в районе вызова CreateProcess() |
Автор: GremlinProg 12.10.2010, 13:55 |
перед CreateProcess можно еще вставить GetStartupInfo( &si ); да и вообще, не хорошо передавать туда пустую структуру, там же указатели есть |
Автор: anatox91 12.10.2010, 13:57 |
да это вряд ли из-за этого, в другой программе у меня этот же участок кода нормально срабатывал, процессы создавались на ура бывают проблемы разве что если передать NULL вместо этих структур, а так нормально) |
Автор: GremlinProg 12.10.2010, 14:10 |
если процесс создается, значит надо смотреть что он делает |
Автор: anatox91 12.10.2010, 14:12 | ||
lab5_memsort.exe
|
Автор: GremlinProg 12.10.2010, 14:38 |
SYNCHRONIZE тут недостаточно, лучше MUTEX_ALL_ACCESS, но это не суть, + надо еще проверить mapFile и shared_memory а вообще, поставь перед и после WaitForSingleObject MessageBox'ы: если процесс создается, то ему ломаться просто негде до WaitForSingleObject |
Автор: anatox91 12.10.2010, 16:24 | ||||
сделал так: lab5_memshare:
lab5_memsort:
выводит только один раз 123 и вылетает, то есть именно при создании процесса и видимо до Wait'а... сейчас еще попробую поэкспериментировать... Добавлено @ 16:39 вобщем вылетает именно на вызове CreateProcess(), процесс не создается, GetStartupInfo() тоже не помог... |
Автор: GremlinProg 12.10.2010, 21:11 | ||
|
Автор: anatox91 13.10.2010, 15:59 | ||||
помогло))) только я так и не понял в чем был прикол, ведь это тоже самое:
|
Автор: anatox91 13.10.2010, 16:18 | ||
но тут появилась еще одна проблемка: первый процесс(memshare) не ожидает пока второй отсортирует данные в памяти общего доступа и начинает их сразу выводить и в конце вылетает, т.е. синхронизация не работает, и я не могу понять что там не так... Если вот в этом участке кода после освобождения мьютекса добавить Sleep() на пару секунд, то второй процесс успевает отсортировать и все срабатывает нормально, но как это организовать с помощью мьютексов?
Добавлено через 2 минуты и 36 секунд нужно просто сделать чтобы первый процесс выполнил необходимые операции с памятью, потом подождал пока другой процесс эти данные отсортирует, и вывел их Добавлено через 3 минуты и 56 секунд а второй процесс должен ждать пока первый выделит память, потом отсортировать ее и все |
Автор: GremlinProg 13.10.2010, 17:00 |
дело не в TEXT, а в том, что в CreateProcess передавалась константа в качестве командной строки (у нас уже был такой случай, можно было поискать) завести второй мьютекс |
Автор: anatox91 13.10.2010, 18:00 | ||||||
вот чуть подправил программки для двух мьютексов, но почему-то не срабатывает WaitForSingleObject() для второго мьютекса в первой программе, всегда вылетает окошко с ошибкой: memshare
в этом месте
memsort
где я еще туплю?) |
Автор: GremlinProg 13.10.2010, 18:38 |
нет гарантии, что на 52 строке memsort прошел 10, т.е. на 52 строке второй мьютекс может быть вообще еще не создан самое простое: создать оба мьютекса в главной программе, она же по любому стартует первой + при открытии, надо захватить второй мьютекс в memsort, чтобы не было бесконечного Wait в 53 строке Добавлено через 8 минут и 58 секунд хотя, нет, это же мьютекс, в 53 строке он может быть только захвачен раньше, чем в memsort, значит это должен быть не мьютекс, а например событие, которое будет создаваться несигнальным, а сигнализироваться в memsort Добавлено через 11 минут и 20 секунд если это будет событие, то в memsort его нужно только открыть и заменить ReleaseMutex(mutex2) на SetEvent(mutex2) ну, mutex2 можно конечно переименовать, оно теперь event ![]() |
Автор: anatox91 13.10.2010, 20:02 |
не, в задании сказано только через мьютексы сделать синхронизацию Добавлено через 1 минуту и 34 секунды блин, можно ведь гораздо проще сделать, просто ожидать окончания процесса))) Добавлено через 1 минуту и 56 секунд и обойтись одним мьютексом) |
Автор: GremlinProg 13.10.2010, 20:09 | ||
![]() ![]() |
Автор: anatox91 13.10.2010, 20:10 |
все отлично работает, спасибо еще раз) Добавлено через 32 секунды мьютекс нужен чтобы второй процесс подождал пока первый приготовит память |
Автор: anatox91 13.10.2010, 20:48 |
там в вариантах заданий кроме мьютексов были еще бинарные и считающие семафоры(у меня попался мьютекс), с помощью них это можно было бы сделать без ожидания окончания процесса и без событий? если нет, то это наверно ошибка в задании... |
Автор: GremlinProg 13.10.2010, 21:35 | ||
без дополнительных синхронизаций, по-моему не реально (нельзя захватить мьютекс чужими руками, только своими), а вот с одним барьером можно:
тогда m будет решать поставленную задачу |