Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Critical Sections

535
29 января 2008 года
Нездешний
537 / / 17.01.2008
Доброе время суток всем!
Создал в программе несколько потоков и структуру для обмена данными между ними. В потоках периодически выполняются математические функции с полями структуры. Правильно ли будет в каждом потоке объявить свою CRITICAL_SECTION, или она должна быть одна на всех?

Код:
//поток с отображением данных на форму
struct{ ... } ExchangeData;
...
Thread1->Resume();
Thread2->Resume();

//Thread1.cpp
void __fastcall Thread1::Execute()
{
     CRITICAL_SECTION cs;
     InitializeCriticalSection(&cs);    

     while( !Terminated )
     {
          EnterCriticalSection(&cs);
          MathFunc1();
          LeaveCriticalSection(&cs);

          Sleep(TimePeriod);
     }

     DeleteCriticalSection(&cs);
}

//Thread2.cpp
void __fastcall Thread2::Execute()
{
     CRITICAL_SECTION cs;
     InitializeCriticalSection(&cs);    

     while( !Terminated )
     {
          EnterCriticalSection(&cs);
          MathFunc2();
          LeaveCriticalSection(&cs);

          Sleep(TimePeriod);
     }

     DeleteCriticalSection(&cs);
}

//MathFunc1() и MathFunc2() делают вычисления с использованием ExchangeData
240
29 января 2008 года
aks
2.5K / / 14.07.2006
Ну если ты что то хочешь синхронизовать, то нужна одна критическая секция, через которую и будет происходить синхронизация.

В каждом потоке вобще смысла не имеет, поскольку в винде помоему один поток больше чем один раз одну критическую секцию залокать не может - типа чтоб дедлоков не было. ))
535
30 января 2008 года
Нездешний
537 / / 17.01.2008
Хм... и как тогда синхронизировать в моем случае? Инициализировать секцию в основном потоке, передать указатель на нее в другие потоки?
1
30 января 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Нездешний
Хм... и как тогда синхронизировать в моем случае? Инициализировать секцию в основном потоке, передать указатель на нее в другие потоки?


Инициализировать секцию в функции создания потоков - и передавать ссылку на нее в потоки. А более верно, вхождение в критическую секцию делать в функциях MathFunc1() и MathFunc2().

246
30 января 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Нездешний
Доброе время суток всем!
Создал в программе несколько потоков и структуру для обмена данными между ними. В потоках периодически выполняются математические функции с полями структуры. Правильно ли будет в каждом потоке объявить свою CRITICAL_SECTION,


нет

Цитата: Нездешний
или она должна быть одна на всех?


да, объяви ее глобально и инициализируй перед стартом потоков

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог