タグ付けされた質問 「multithreading」

マルチスレッドとは、複数の同時実行ストリーム(一般にスレッドと呼ばれる)を利用して、コンピューターまたはプログラムが作業を同時にまたは非同期に実行する機能です。

3
ブラケットはスレッド内でリソースを解放しません
Haskellで問題が発生しbracketています。フォークされたスレッド内で(forkFinally)bracketの2番目の引数を使用して実行すると、プログラムの終了時にリソースを解放する計算が実行されません。 問題を示すコードは次のとおりです(この特定のケースでは、バッファリングを無効にしてファイルにすぐに書き込むことができることを知っています)。 import System.IO import Control.Exception ( bracket , throwTo ) import Control.Concurrent ( forkFinally , threadDelay ) main = do threadId <- forkFinally (writeToFile "first_file") (\ex -> putStrLn $ "Exception occurred: " ++ show ex) putStrLn "Press enter to exit" _ <- getLine putStrLn "Bye!" writeToFile :: FilePath -> …

1
なぜTask.Run()がUIスレッド/オリジンコンテキストに同期するのを待たないのですか?
非同期待ちのパターンとTask.Run動作は理解できたと思いました。 しかし、次のコード例でawait、完了したタスクから戻った後、なぜUIスレッドに同期しないのかと思います。 public async Task InitializeAsync() { Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // "Thread: 1" double value = await Task.Run(() => { Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6 // Do some CPU expensive stuff double x = 42; for (int i = 0; i < 100000000; i++) { x += i - Math.PI; } …

2
RX vs Theads vs Executorsのマルチヘッドのパフォーマンス
Kotlinでバックエンドアプリケーションを作成しています。 速度を上げるために、私は現在、サーバーのRxKotlinを使用して、データベース呼び出しやAPI呼び出しなどのIOタスクの並列実行を行っています。コードは通常、次のようになります。 val singleResult1 = Single.fromCallable{ database.get(....) }.io() val singleResult2 = Single.fromCallable{ database.update(....) }.io() Single.zip(singleResult1, singleResult2){ result1: Result1, result2: Result2 -> .... } .flatMap{ //other RX calls } .subscribeOn(Schedulers.io()) .observeOn(Schedulers.computation()) .blockingGet() ただし、実際には複数のイベント(単一のイベント)では機能しないため、Rxは少し乱雑な感じになり、ボイラープレートの束を追加するだけです(null値を返したい場合や、スタックトレースをめちゃくちゃにする可能性がある場合にも複雑になります) ) Executors代わりに、Rxを削除して並列処理に使用(またはスレッド)することを考えています。ここで考慮すべきパフォーマンスの考慮事項はありますか? 私が考えている例: fun <T> waitAll(tasks: List<Callable<T>>, threadCount: Int = -1): List<T> { val threads = if (threadCount …

1
このスレッドサニツァー警告のレースはどこですか?
以下のコードは、macOSでスレッドサニタイザーを使用して実行すると警告を生成します。レースの場所がわかりません。shared_ptrおよびweak_ptrの制御ブロックはスレッドセーフであり、からのプッシュとポップstd::queueはロックを保持したまま行われます。 #include <future> #include <memory> #include <queue> class Foo { public: Foo() { fut = std::async(std::launch::async, [this] { while (!shouldStop) { std::scoped_lock lock(mut); while (!requests.empty()) { std::weak_ptr<float> requestData = requests.front(); requests.pop(); (void)requestData; } } }); } ~Foo() { shouldStop.store(true); fut.get(); } void add(const std::weak_ptr<float> subscriber) { std::scoped_lock lock(mut); requests.push(subscriber); } …

2
forループで配列を反復処理することは、C#のスレッドセーフ操作ですか?IEnumerable <T>をforeachループで反復するのはどうですか?
私の理解に基づいて、C#の配列を指定して、複数のスレッドから同時に配列を反復処理の行為は、あるスレッド安全な操作。 することにより、配列を反復処理 Iは、によって、アレイ内のすべての位置を読んで意味昔ながらのforループ。各スレッドは単に配列内のメモリ位置のコンテンツを読み取っているだけで、誰も何も書き込んでいないため、すべてのスレッドが一貫した方法で同じものを読み取ります。 これは、上で書いたことを実行するコードの一部です。 public class UselessService { private static readonly string[] Names = new [] { "bob", "alice" }; public List&lt;int&gt; DoSomethingUseless() { var temp = new List&lt;int&gt;(); for (int i = 0; i &lt; Names.Length; i++) { temp.Add(Names[i].Length * 2); } return temp; } } したがって、私の理解では、メソッドDoSomethingUseless はスレッドセーフでありstring[]、をスレッドセーフタイプ(ImmutableArray&lt;string&gt;たとえば)に置き換える必要はありません。 私は正しいですか? …

2
CompareExchangeに基づくインターロックされた実装はSpinWaitを使用する必要がありますか?
以下は、に基づくインターロックされたメソッドの実装ですInterlocked.CompareExchange。 このコードでSpinWait繰り返しを行う前にスピンを使用することをお勧めしますか? public static bool AddIfLessThan(ref int location, int value, int comparison) { int currentValue; do { currentValue = location; // Read the current value if (currentValue &gt;= comparison) return false; // If "less than comparison" is NOT satisfied, return false } // Set to currentValue+value, iff still on currentValue; …

2
awaitを使用することと、非同期タスクを処理するときにContinueWithを使用することとの違いは何ですか?
これが私の意味です: public Task&lt;SomeObject&gt; GetSomeObjectByTokenAsync(int id) { string token = repository.GetTokenById(id); if (string.IsNullOrEmpty(token)) { return Task.FromResult(new SomeObject() { IsAuthorized = false }); } else { return repository.GetSomeObjectByTokenAsync(token).ContinueWith(t =&gt; { t.Result.IsAuthorized = true; return t.Result; }); } } 上記の方法は待つことができますが、T askベースのA同期P atternが提案することとよく似ていると思いますか?(私が知っている他のパターンはAPMおよびEAPパターンです。) では、次のコードはどうでしょう。 public async Task&lt;SomeObject&gt; GetSomeObjectByToken(int id) { string token = repository.GetTokenById(id); …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.