ホームページ > バックエンド開発 > C#.Net チュートリアル > C# でのアトミック操作に Interlocked を使用するためのヒント

C# でのアトミック操作に Interlocked を使用するためのヒント

黄舟
リリース: 2016-12-15 14:17:02
オリジナル
3015 人が閲覧しました

アトミック操作とは何ですか?

アトムとはもともと「それ以上分割できない最小の粒子」を意味し、アトミック操作は「中断できない1つまたは一連の操作」を意味します 。 C# では、複数のスレッドが同時に変数を操作する場合、複数のスレッドが取得した値が最新の値にならないようにアトミック操作を使用する必要があります。

例: int result = 0;

マルチスレッドAはresult(0)+1を実行しています

マルチスレッドBはresult(0)+1を同時に実行しています

その場合、最終結果は1になりますそれとも2、これは言うのは難しいです。 2 つのスレッドが CPU で同時に計算すると、得られる結果は 1 になります。明らかに、この結果は私たちが望んでいる結果ではありません。もちろん、ロックを使用してマルチスレッド実行の一意性を確保することもできますが、そのパフォーマンスはアトミック操作よりもはるかに劣ります。

アトミックな操作には Interlocked を使用します。

.NET が提供する Interlocked クラスを使用して、ロックのように見えますが、アトミックな操作は CPU 自体に基づいています。はノンブロッキングなので、ロックよりも効率的です。

以下では、C# コードを使用してアトミック操作を示します。

class Program
{
//全局变量
private static int _result;
//Main方法
static void Main(string[] args)
{
//运行后按住Enter键数秒,对比使用Interlocked.Increment(ref _result);与 _result++;的不同
  while (true)
{
Task[] _tasks = new Task[100];
int i = 0;
for (i = 0; i < _tasks.Length; i++)
{
_tasks[i] = Task.Factory.StartNew((num) =>
{
var taskid = (int)num;
Work(taskid);
}, i);
}
Task.WaitAll(_tasks);
Console.WriteLine(_result);
Console.ReadKey();
}
}
//线程调用方法
private static void Work(int TaskID)
{
for (int i = 0; i < 10; i++)
{
//_result++;
Interlocked.Increment(ref _result);
}
}
}
ログイン後にコピー


上記のコードを実行するときに、コードの最後の 2 行をコメントします。 _result); を実行し、いずれかの行を実行した後、Enter キーを押したまま数秒間実行すると、2 つの行の違いがわかります。

この時点で、Interlocked の役割が反映されます。この記事のサンプル ソース コードをダウンロードします: Interlocked_Sample。

アトミック操作に関するその他の命令: 32 ビット CPU で代入命令を実行する場合、データ送信の最大幅は4バイト。したがって、読み取りおよび書き込み操作が 4 バイト未満である限り、32 ビット CPU はアトミック操作となります。したがって、bool や int などの型の操作自体はアトミック操作です。 Interlocked が提供するアトミック操作メソッドは、機能的な CPU 命令を最下層にカプセル化することで完成します。

上記は、編集者が紹介した C# でのアトミック操作に Interlocked を使用するテクニックです。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。 その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート