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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное использование мьютекса 
V
    Опции темы
Игорь1024
Дата 17.11.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Синхронизирую потоки (пытаюсь, по крайней мере..);
Использовал мьютекс. Написал в таком виде:
Код

DWORD WINAPI Do_Something(LPVOID p)
{
    
    write=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Write_in");
    if(write==NULL)
    {
        write=CreateMutex(NULL,TRUE,"Write_in");
    }
    else
    {
    WaitForSingleObject(write,INFINITE);
    }
...//что-нибудь делаем
    if(ReleaseMutex(write)==FALSE)MessageBox(NULL,"Releasing mutex failed","Error!",MB_OK);
    CloseHandle(write);
}

Хех, не работает. Что я делаю не так?
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
azesmcar
Дата 17.11.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Игорь1024 @  17.11.2010,  16:09 Найти цитируемый пост)
Синхронизирую потоки (пытаюсь, по крайней мере..);

В виндоуз немного напутали с терминологией smile
На самом деле тут тебе мьютекс не нужен (точнее нужен, но не виндоузовский). Классический мьютекс микрософт обозвала критической секцией, вот ее и используй.

Код

InitializeCriticalSection(...);

EnterCriticalSection(...);
// работа защищенными данными
LeaveCriticalSection(...);


Цитата(Игорь1024 @  17.11.2010,  16:09 Найти цитируемый пост)
Что я делаю не так? 

Смотри пример smile 
http://msdn.microsoft.com/en-us/library/ms686927(VS.85).aspx

Добавлено @ 16:17
Цитата(azesmcar @  17.11.2010,  16:14 Найти цитируемый пост)
EnterCriticalSection(...);
// работа защищенными данными
LeaveCriticalSection(...);

... и не забывай про безопасность исключений.

кстати, почему не boost?

Это сообщение отредактировал(а) azesmcar - 17.11.2010, 16:21
PM   Вверх
mes
Дата 17.11.2010, 16:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  17.11.2010,  15:14 Найти цитируемый пост)
кстати, почему не boost?

а почему С++ ?
второй раз за седня пишу подобное..


Это сообщение отредактировал(а) mes - 17.11.2010, 16:24


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 17.11.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  17.11.2010,  16:24 Найти цитируемый пост)
а почему С++ ?

с новым стандартом этот вопрос перестанет быть актуальным smile 
PM   Вверх
mes
Дата 17.11.2010, 16:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  17.11.2010,  15:25 Найти цитируемый пост)
с новым стандартом этот вопрос перестанет быть актуальным

хм.. но с чего решили, что у тс С++ ? 


Это сообщение отредактировал(а) mes - 17.11.2010, 16:27


--------------------
PM MAIL WWW   Вверх
mrbrooks
Дата 17.11.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(mes @  17.11.2010,  16:26 Найти цитируемый пост)
хм.. но с чего решили, что у тс С++ ? 

тебе, камрад, это так жить мешает? smile

Хотя по хорошему надо конечно ввести какие то идентификаторы языка. Причем даже не в самом вопросе - а в теме - как в ЦП сделали. А то реальна ветка форума одна - а языков в ней два.
PM MAIL   Вверх
mes
Дата 17.11.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mrbrooks @  17.11.2010,  15:44 Найти цитируемый пост)
тебе, камрад, это так жить мешает? 

неа.. мне просто скучно.. 


Добавлено через 46 секунд
Цитата(mrbrooks @  17.11.2010,  15:44 Найти цитируемый пост)
Хотя по хорошему надо конечно ввести какие то идентификаторы языка. Причем даже не в самом вопросе - а в теме - как в ЦП сделали. 

 smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 17.11.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  17.11.2010,  16:26 Найти цитируемый пост)
хм.. но с чего решили, что у тс С++ ? 

в каком смысле? мы в разделе C++ и код написан на C++.
PM   Вверх
mes
Дата 17.11.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  17.11.2010,  16:24 Найти цитируемый пост)

в каком смысле? мы в разделе C++ и код написан на C++. 

мы в разделе  C/C++..



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 17.11.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  17.11.2010,  17:27 Найти цитируемый пост)
мы в разделе  C/C++..

а в этом смысле.. smile значит не понял первоначального вопроса.

ну не знаю, просто предположил. В этом разделе C++ как бы стал языком по умолчанию. smile 
PM   Вверх
Игорь1024
Дата 18.11.2010, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



я там пишу в файл.
знаю что можно чтоб сразу  несколько потоков писали при помощи WriteFile, но интересно как сделать так.
а с использованием кр.секц (я их сразу использовал-ошибки) вылетает с рантайм ошибкой (даже когда пишущий поток всего один). потому и попробовл мьютекс. 
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
azesmcar
Дата 18.11.2010, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Игорь1024

Мьютекс - объект ядра и используется в основном для межпроцессорной синхронизации, для потоков достаточно критической секции, покажи проблемный код.
PM   Вверх
Игорь1024
Дата 18.11.2010, 06:41 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Здесь код для записи данных юзера (Та же функция, что и в моём прошлом посте... только решил синхронизировать, ведь пытаюсь написать небольшой чат).
Эту функцию вызывают несколько потоков (Сколько юзеров регится-столько и потоков).
Про различие мьютексов и критических секций я знаю (спасибо Рихтеру smile ).
Насчёт функции:
функция вызывается каждый раз, когда юзер присылает данные при регистрации.
(у меня для каждого юзера есть свой поток приёма сообщений (привязанный к сокету), если получаем сообщение на регестрацию-вызываем Get_N_P)

Код


CRITICAL_SECTION *ps;
DWORD WINAPI Get_N_P(LPVOID p)
{
    
    InitializeCriticalSection(ps);
    EnterCriticalSection(ps);
    SOCKET cl=(SOCKET)p;
    fstream pr_dat("E:\\My_chat_prog\\users.txt",ios::app);
    for(int i=0;i<2;i++)
    {
        recv(cl,buf2,56,0);
        pr_dat<<buf2<<'\n';
        pr_dat.flush();
        for(int j=0;j<56;j++)
        {
            buf2[j]='\0';
        }
    }
    pr_dat.close();
    LeaveCriticalSection(ps);
    return 0;
}


Это сообщение отредактировал(а) Игорь1024 - 19.11.2010, 15:05
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
azesmcar
Дата 18.11.2010, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Игорь1024 @  18.11.2010,  06:41 Найти цитируемый пост)
функция вызывается каждый раз, когда юзер присылает данные при регистрации.


Цитата(Игорь1024 @  18.11.2010,  06:41 Найти цитируемый пост)
InitializeCriticalSection(ps);

Инициализация должна выполняться один раз.

Добавлено через 10 минут и 26 секунд
Просто к сведению: в критической секции нужно выполнять минимум действий. Лень вдаваться в детали, но у тебя на первый взгляд много лишнего. Конкретно в твоем случае я вообще не вижу смысла в многопоточности, все равно ничего параллельно не выполняется. Как только один поток войдет в критическую секцию остальные будут покорно ждать его завершения, так зачем вообще потоки? Если решил заняться параллельным программирование, то для начала надо понять когда их вообще стоит использовать. Основные цели для использования многопоточности - логическое разделение и повышение производительности. У большинства людей на сегодняшний день стоит многоядерные процессоры, и для того, чтобы использовать всю мощь этих компьютеров нужно писать программу с учетом этого. Еслибы все было идеально и задачу можно было бы действительно разделить на две отдельные задачи то на 2х процессорной машине можно было бы получить 100% прирост производительности, но это не часто бывает. Подробнее смотри Закон Амдала, в твоем конкретном случае прирост производительности - 0%.

Добавлено через 14 минут и 36 секунд
mes

и все таки это C++ smile 
PM   Вверх
Игорь1024
Дата 18.11.2010, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



А по-моему многопоточнось здесь совсем не помешает  smile . (для каждого юзера есть поток-для приёма данных).
И кстати рантайм ошибка вылезает, если использую крит.секцию. (даже если 1 раз инициализирую).
0xC0000005: Access violation writing location 0x00000004.
--------------------
The God is real,unless he is declared as integer.
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.1505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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