Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потоков. Объекты CRITICAL_SECTION 
:(
    Опции темы
ChiciucMaxim
Дата 16.7.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 22.6.2008

Репутация: нет
Всего: нет



Добрый вечер. У меня такой вопрос: почему объектами CRITICAL_SECTION можно выполнять синхронизацию лишь среди потоков внутри одного процесса? Почему нельзя воспользоватся приемом отображения файлов для того чтобы 2 процесса имели доступ к одной и той же переменной CRITICAL_SECTION и использовали ее для синхронизации собственных потоков?
PM MAIL   Вверх
Lazin
Дата 16.7.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(ChiciucMaxim @  16.7.2008,  21:48 Найти цитируемый пост)
Добрый вечер. У меня такой вопрос: почему объектами CRITICAL_SECTION можно выполнять синхронизацию лишь среди потоков внутри одного процесса? Почему нельзя воспользоватся приемом отображения файлов для того чтобы 2 процесса имели доступ к одной и той же переменной CRITICAL_SECTION и использовали ее для синхронизации собственных потоков? 

потому-что для этого существуют именованые мьютексы smile 
PM MAIL Skype GTalk   Вверх
Rififi
Дата 16.7.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



потому что тогда те чуваки из microsoft, которые реализовали мьютексы в winapi, получается тратили свое рабочее время на ненужную функциональность. думаю, им бы не понравилась такая характеристика.
PM MAIL   Вверх
ChiciucMaxim
Дата 16.7.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Rififi
Дата 16.7.2008, 23:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



Цитата(ChiciucMaxim @  16.7.2008,  22:31 Найти цитируемый пост)
Ведь по сути дела используется одно и тоже значение из отображенного файла.

похоже, ты знаешь что-то, чего не знает больше никто (кроме ребят из MS ну и пожалуй Соломона с Руссиновичем)
PM MAIL   Вверх
Riply
Дата 17.7.2008, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 1
Всего: 32



Цитата(ChiciucMaxim @  16.7.2008,  21:48 Найти цитируемый пост)
Почему нельзя воспользоватся приемом отображения файлов для того чтобы 2 процесса имели доступ к одной и той же переменной CRITICAL_SECTION и использовали ее для синхронизации собственных потоков? 


Потому что Handle`ы  OwningThread и  LockSemaphore в рамках одного процесса
не имеют никакого смысла в рамках другого. 
Даже если попробовать во втором процессе "продубликатить" (DuplicateHandle)
LockSemaphore и насильно его запихать в CRITICAL_SECTION, то это ничего не даст,
ибо OwningThread будет фиксироваться автоматически Handle`ом валидным только в рамках
того процесса, которому принадлежит нить, захватившая ресурс.
Вот такое мое IMHO smile

По теме: почитай Рихтера. Если мне не изменяет память, главы 8-10.
Там он подробно описывает (и создает) "критическую секцию" (название такое же, но струтуры разные)
 для межпроцессорного взаимодействия.

PM MAIL   Вверх
Lazin
Дата 17.7.2008, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



С обычным мьютексом код намного компактнее ;)
PM MAIL Skype GTalk   Вверх
Riply
Дата 17.7.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 1
Всего: 32



Цитата(Lazin @  17.7.2008,  05:18 Найти цитируемый пост)
С обычным мьютексом код намного компактнее ;) 


Не смею с Вами спорить smile
Если честно, то детально я не разбиралась с межпроцессорной синхронизацией (не было необходимости),
но в защиту Рихтера, рискну предположить, что его код окажется на порядк(и) "быстрее".
Чтобы вынести более точный вердикт, необходимо тщательное изучение, что он там делает и почему,
а не "галопом по европам" как я  smile 
С подобными вещами (оптимальностью кода) я сталкивалась на других его примерах.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.