//поток с отображением данных на форму
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
Critical Sections
Создал в программе несколько потоков и структуру для обмена данными между ними. В потоках периодически выполняются математические функции с полями структуры. Правильно ли будет в каждом потоке объявить свою CRITICAL_SECTION, или она должна быть одна на всех?
Код:
В каждом потоке вобще смысла не имеет, поскольку в винде помоему один поток больше чем один раз одну критическую секцию залокать не может - типа чтоб дедлоков не было. ))
Хм... и как тогда синхронизировать в моем случае? Инициализировать секцию в основном потоке, передать указатель на нее в другие потоки?
Цитата: Нездешний
Хм... и как тогда синхронизировать в моем случае? Инициализировать секцию в основном потоке, передать указатель на нее в другие потоки?
Инициализировать секцию в функции создания потоков - и передавать ссылку на нее в потоки. А более верно, вхождение в критическую секцию делать в функциях MathFunc1() и MathFunc2().
Цитата: Нездешний
Доброе время суток всем!
Создал в программе несколько потоков и структуру для обмена данными между ними. В потоках периодически выполняются математические функции с полями структуры. Правильно ли будет в каждом потоке объявить свою CRITICAL_SECTION,
Создал в программе несколько потоков и структуру для обмена данными между ними. В потоках периодически выполняются математические функции с полями структуры. Правильно ли будет в каждом потоке объявить свою CRITICAL_SECTION,
нет
Цитата: Нездешний
или она должна быть одна на всех?
да, объяви ее глобально и инициализируй перед стартом потоков