Я все еще новичок в многопоточности, поэтому потерпите меня, пожалуйста:
В настоящее время я пишу приложение, которое выполняет вычисления FVM в сетке.это модель с явным временем, поэтому на каждом временном шаге мне нужно вычислять новые значения для всей сетки.моя идея состояла в том, чтобы распределить это вычисление на 4 рабочих потока, которые затем обрабатывают ячейки сетки (первый поток вычисляет 0, 4, 8 ... второй поток 1, 5, 9 ... и т. д.).
я создаю эти 4 потока при запуске программы.
они выглядят примерно так:
void __fastcall TCalculationThread::Execute()
{
bool alive = true;
THREAD_SIGNAL ts;
while (alive)
{
Sleep(1);
if (TryEnterCriticalSection(&TMS))
{
ts = thread_signal;
LeaveCriticalSection(&TMS);
alive = !ts.kill;
if (ts.go && !ts.done.at(this->index))
{
double delta_t = ts.dt;
for (unsigned int i=this->index; i < cells.size(); i+= this->steps)
{
calculate_one_cell();
}
EnterCriticalSection(&TMS);
thread_signal.done.at(this->index)=true;
LeaveCriticalSection(&TMS);
}
}
}
они используют глобальную структуру для связи с основным потоком (основным потоком)устанавливает ts.go в значение true, когда работникам нужно начинать.
Теперь я уверен, что это не способ сделать это! Мало того, что это не правильно, но и не очень хорошо ...
я прочитал, например, здесь , что семафор или событие будет работать лучше. Ответ на вопрос этого парня говорит о очереди без блокировки.
Я не очень знаком с этими понятиями, хотел бы, чтобы некоторые указатели продолжали. Не могли бы вы указать какой-либо из способов сделать это лучше?
Спасибо за ваше время. (и извините за форматирование)
Я использую Borland C ++ Builder и его поток-объект (TThread).