![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ChiciucMaxim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Добрый вечер. У меня такой вопрос: почему объектами CRITICAL_SECTION можно выполнять синхронизацию лишь среди потоков внутри одного процесса? Почему нельзя воспользоватся приемом отображения файлов для того чтобы 2 процесса имели доступ к одной и той же переменной CRITICAL_SECTION и использовали ее для синхронизации собственных потоков?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
потому-что для этого существуют именованые мьютексы |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 2 Всего: 36 |
потому что тогда те чуваки из microsoft, которые реализовали мьютексы в winapi, получается тратили свое рабочее время на ненужную функциональность. думаю, им бы не понравилась такая характеристика.
|
|||
|
||||
| ChiciucMaxim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Я знаю про это. Но не могу понять почему технически это невозможно реализовать. Ведь по сути дела используется одно и тоже значение из отображенного файла.
Добавлено @ 22:46 Представляю 2 процесса: Первым запускается процесс А. Process A: #include <windows.h> #include <tchar.h> #include <process.h> #include <iostream> using namespace std; CRITICAL_SECTION *lpCrtSct; unsigned int WINAPI threadFunc(void *arg) { EnterCriticalSection(lpCrtSct); for(int i = 0; i < 5; i++) { Sleep(1000); cout << "a "; } cout << endl; LeaveCriticalSection(lpCrtSct); // глючит тут: First-chance exception at 0x7c964ed1 in 8_8_1.exe: 0xC0000008: //An invalid handle was specified. return 1; } int main() { HANDLE hFile = CreateFile(_T("F:\\map.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); int option; HANDLE hndl; HANDLE mFile = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, 64, _T("m")); lpCrtSct = (CRITICAL_SECTION *)MapViewOfFile(mFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CRITICAL_SECTION)); InitializeCriticalSection(lpCrtSct); cout << "begin? "; cin >> option; if(option == 1) { unsigned int id; hndl = (HANDLE)_beginthreadex(0, 0, threadFunc, 0, 0, &id); WaitForSingleObject(hndl, INFINITE); } return 1; } Этот процесс производит отображение файла, записывая в него значение *lpCrtSct Process B: #include <windows.h> #include <tchar.h> #include <process.h> #include <iostream> using namespace std; CRITICAL_SECTION *lpCrtSct; unsigned int WINAPI threadFunc(void *arg) { EnterCriticalSection(lpCrtSct); for(int i = 0; i < 10; i++) { Sleep(1000); cout << "b "; } cout << endl; LeaveCriticalSection(lpCrtSct); return 1; } int main() { HANDLE hFile = CreateFile(_T("F:\\map.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); int option; HANDLE mFile = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, 64, _T("t")); //lpCrtSct указывает на тоже значение используемое в Process A. lpCrtSct = (CRITICAL_SECTION *)MapViewOfFile(mFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CRITICAL_SECTION)); cout << "begin?"; cin >> option; if(option == 1) { unsigned int id; HANDLE thrdHndl = (HANDLE)_beginthreadex(0, 0, threadFunc, 0, 0, &id); WaitForSingleObject(thrdHndl, INFINITE); } return 1; } Это сообщение отредактировал(а) ChiciucMaxim - 16.7.2008, 22:50 |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 2 Всего: 36 |
||||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 1 Всего: 32 |
Потому что Handle`ы OwningThread и LockSemaphore в рамках одного процесса не имеют никакого смысла в рамках другого. Даже если попробовать во втором процессе "продубликатить" (DuplicateHandle) LockSemaphore и насильно его запихать в CRITICAL_SECTION, то это ничего не даст, ибо OwningThread будет фиксироваться автоматически Handle`ом валидным только в рамках того процесса, которому принадлежит нить, захватившая ресурс. Вот такое мое IMHO По теме: почитай Рихтера. Если мне не изменяет память, главы 8-10. Там он подробно описывает (и создает) "критическую секцию" (название такое же, но струтуры разные) для межпроцессорного взаимодействия. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
С обычным мьютексом код намного компактнее ;)
|
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 1 Всего: 32 |
Не смею с Вами спорить Если честно, то детально я не разбиралась с межпроцессорной синхронизацией (не было необходимости), но в защиту Рихтера, рискну предположить, что его код окажется на порядк(и) "быстрее". Чтобы вынести более точный вердикт, необходимо тщательное изучение, что он там делает и почему, а не "галопом по европам" как я С подобными вещами (оптимальностью кода) я сталкивалась на других его примерах. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |