私はまだマルチスレッドでの初心者です((1)例えば、スリープのために避ける)、そう私と一緒に負担してください。どのように私は正しくワーカースレッドを設計するのですか?
私は現在、グリッド上でいくつかのFVM計算を行うアプリケーションを書いています。時間明示的なモデルなので、タイムステップごとにグリッド全体の新しい値を計算する必要があります。私の考えは、この計算を4つのワーカースレッドに分配し、グリッドのセル(最初のスレッドは0,4,8を計算... 2番目のスレッド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);
}
}
}
彼らは労働者が起動する必要があるとき(メインスレッドセットがtrueにts.goメインスレッドと通信するために、グローバルな構造体を使用し
今私はこれを行う方法ではないと確信しています!それは間違っているだけでなく、それもうまく行かない...
私はセマフォやイベントがうまくいくことを、例えばhereで読んでいます。 this guy's questionに関するお問い合わせロックレスキュー
私はこれらの概念に精通していません。 あなたはこれをより良くするための方法を整理できますか?
はあなたの時間をありがとうございました。 (そしてフォーマットにごめんなさい)
私は、Borland C++ビルダーとそのスレッドオブジェクト(TThread)を使用しています。
なぜ「スリープ」を呼びますか? –
@David:多分スレッド時間を生むために! 'Sleep(0)'はまったく同じ結果を得るためによく使用されます。 – 0xC0000022L
ちょっと - 誰かが私の古い記事を読む!私はそれだけでアップアップすることができますが、それは少し自助しています。 –