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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок доступа к критическим секциям... в каком порядке потоки занимают..... 
:(
    Опции темы
and_master
Дата 3.3.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Друзья, к вам еще парачка дурацких вопросов....  Я прочитал про критические секции, как средство синхронизации и разграничения доступа.. То есть, насколько я понимаю, поток первым вошедший в критическую секцию никого к охраняемым ресурсам не пустит...  Тогда подскажите, почему в результате приведенной программки я получаю на экране 0, а не 10.....  Растолкуйте пожалуйста... 

Код

#include "stdafx.h"
#include <windows.h>
#include <process.h>  
#include <stdio.h>

CRITICAL_SECTION cs;
int a[ 2 ];

void Thread( void* pParams )
{
        EnterCriticalSection( &cs ); 
        a[0] = 10;
        LeaveCriticalSection( &cs );
}

int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection( &cs );
    _beginthread( Thread, 0, NULL );

    EnterCriticalSection( &cs );    
    printf( "%d\n", a[ 0 ], "\n" );
    LeaveCriticalSection( &cs );
    
    Sleep(10000);
    return 0;
}

PM MAIL   Вверх
Fazil6
Дата 3.3.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



потому, что сначала отрабатывает
Код

printf( "%d\n", a[ 0 ], "\n" );


а потом
Код

a[0] = 10;

PM MAIL   Вверх
and_master
Дата 3.3.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А если надо наоборот? Тогда в чем смысл критических секций и что они дают вообще... Приведите фрагмент кода в пример, если вас не затруднит
PM MAIL   Вверх
Fazil6
Дата 3.3.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(and_master @  3.3.2007,  14:41 Найти цитируемый пост)
А если надо наоборот? Тогда в чем смысл критических секций и что они дают вообще... Приведите фрагмент кода в пример, если вас не затруднит

смысл критических секций - синхронизация. 
Применять нужно когда несколько потоков пользуются какими-то общими ресурсами. Допустим, разные потоки записывают нечто в очередь. В этом случае нужно обеспечить, чтобы когда один поток записывает, другой не имел такой возможности пока первый полностью не закончит свою операцию. Или пока один не запишет, другие не могли ничего считать и ожидали завершения работы другого потока с общим ресурсом 

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


Новичок



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

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



Ну вот, в моем примере..я хочу, чтобы основной поток не имел доступа к массиву a , пока параллельный поток Thread не запишет в него данные..... как такое сделать?????
PM MAIL   Вверх
Fazil6
Дата 3.3.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



у тебя это сделано, но просто первый поток получает доступ раньше второго. Поставь небольшой Sleep сразу после _beginthread и получишь наоборот

Добавлено @ 16:05 
Критическая секция не определяет порядок доступа. Она просто не позволяет другим пользоваться ресурсами, которые контролирует, если с ними уже кто-то работает. 
PM MAIL   Вверх
W4FhLF
Дата 3.3.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



В твоём случае лучше использовать события(CreateEvent, OpenEvent, WaitForSingleObject). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
threef
Дата 3.3.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



В этом случае лучше использовать SuspendThread - ResumeThread - прямое управление остановкой и запуском потока, - и доступ к данным не осуществлять из главного потока приложения. 

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.1332 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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