5

つまり、C#であり、基本的には、各スレッドの配列にデータを格納する位置があります。これをロックする必要がありますか?例えば:

int[] threads = new int[12];

各スレッドは配列内の特定の位置にアクセスします。たとえば、スレッド1はthreads [0]、スレッド2のthreads[1]などの値を更新します。

アイデアは、配列に格納されている値をコンソールに出力させることです。

たくさんのコメントがありました。もっと学びたいと思って、自分が何をしているのかを明確にしたいと思いました。つまり、基本的にその要点は次のとおりです。

メインスレッドは12の個別のスレッドを開始し、各スレッドはメインスレッドの関数を呼び出して、データベースから一連のレコードを取得します。そのメソッドへのアクセスはロックされていますが、スレッドが単独で処理するために約100レコードを返します。

スレッドがレコードを処理しているときに、いくつかのWeb要求を行い、データベースに挿入します。スレッドがレコードのバッチの処理を終了すると、メインスレッドから関数を再度呼び出し、その関数は、最後に終了したスレッドの代わりに新しいスレッドを開始します。

スレッドが処理を行っているので、進行状況をコンソールに出力したいと思います。同じ関数が同時に呼び出されると、各出力のカーソル位置がいたるところに移動するため、最初は各コンソール出力をロックしました。そのため、各値のカウントを格納する配列を作成し、それをすべて出力する関数を作成することを考えていました。私はそれが私が現在していることと本当に何か違うのだろうかと思い始めていますが。

4

2 に答える 2

4

各スレッドが独自のインデックスの値にアクセスしている場合は、複数のスレッドから同時にアクセスすることを心配する必要がないため、問題はありません。

于 2013-01-20T01:21:12.033 に答える
2

各スレッドが配列の別々の部分でのみ機能する場合は、すべてうまくいくと思います。データを共有する(つまり、スレッド間でデータを通信する)場合は、メモリモデルの問題を回避するために、何らかのメモリバリアが必要になります。

それぞれが配列の独自のセクションに配置されているスレッドの束を生成し、それらのスレッドがすべて使用を終了するのを待つ場合、それThread.Joinはあなたが安全であるための障壁の点で十分に機能すると思います。

アレイに関するMSDNドキュメントには次のように書かれています。

このタイプのパブリック静的(Visual Basicで共有)メンバーはスレッドセーフです。インスタンスメンバーは、スレッドセーフであることが保証されていません。

この実装は、配列の同期された(スレッドセーフな)ラッパーを提供しません。ただし、Arrayに基づく.NET Frameworkクラスは、SyncRootプロパティを使用して独自の同期バージョンのコレクションを提供します。

コレクションを介して列挙することは、本質的にスレッドセーフな手順ではありません。コレクションが同期されている場合でも、他のスレッドがコレクションを変更する可能性があるため、列挙子は例外をスローします。列挙中のスレッドの安全性を保証するために、列挙全体でコレクションをロックするか、他のスレッドによって行われた変更に起因する例外をキャッチすることができます。

いいえ、スレッドセーフではありません。一般に、同時アクセスが内部で失敗する可能性がある場合、コレクションは「スレッドセーフではない」と言われますが、各スレッドは異なる位置にアクセスするため、ここでは同時アクセスはありません。

于 2013-01-20T01:24:37.103 に答える