スレッドを使用して人々を先送りにする間違ったアイデアは何ですか?[閉まっている]


12

プログラムにスレッドを実装するのは難しいです。しかし、なぜそれが明らかに必要な場合でも、一部の人々がそれらを実装しないのはなぜですか。

例:プログラムはデータベースからデータセットをロードする必要があります。行うべきことは、接続を確立し、ワーカースレッドでデータベースからデータを取得してからGUIにロードし、GUIスレッドをユーザーに応答させることです。 。

しかし、いや、私はスレッドが邪悪で悪いものだと思っている人と話をしてきました。あるクラスのインストラクターがスレッドの使用に反対することを勧めたため、スレッドの使用をカバーしたくないと聞いたことがあります。何???

ハードウェアがマルチコアになると、スレッドをよりよく理解し、使用することを恐れないようにする必要があると思います。個人的には興味深いテーマだと思います。

スレッドについて聞いたことがあるのに、間違っていることは何ですか?


不適合や不達はスレッドを処理できません。本当の質問は、あなたはそれについて何をするつもりですか?
ジョブ

3
これらは誤った考えではありませんが、スレッドは常に避けるべきです。スレッド化サポートが既に正しく処理され、すべてのプログラマーが自分で行う必要がないように、アーキテクチャを正しく実行してください。プログラマーがすべての状況でスレッドを追加することを学ぶと、大きな問題が発生します。
tp1

質問を振り返らせてください。並列処理機能を活用する別のアプローチがあるかどうかを自問しましたか?または、いくつかのホワイトペーパーが言ったので、または単にそれがより良いプログラマーがクールだと思ったように思われたので、あなたはまっすぐにスレッドにジャンプしましたか?個人的には、スレッドよりもメッセージを相互に渡す軽量プロセスのアイデアが好きです。私は怠け者/愚か者/急いでいますか?ええ、私たち全員もさまざまな程度です。
user1172763 14

回答:


19

スレッド化は難しい

承知しました。かもね。しかし、人々は頭の中にこの考えを持っているので、それを理解しようとして気にしないほど難しい。

不可能ではない。


2
この答えを支持します。人々それが難しいと思います。しかし、理解しようとするのに十分な時間を費やすときではありません。

11
@Pierre、私は多くの人々のハードの定義「理解しようとするのに十分な時間を費やさなければならない」と期待しているでしょう。
ベンジョー

1
TPLおよびawait/ asyncキーワードを使用すると、スレッド化がずっと簡単になります:)
レイチェル

@Pierre 303:それを理解するのに十分な時間を費やすと、それはまだ難しいです。実際、それを最もよく理解している人は、それを可能な限り避ける可能性が最も高いです。
マイケルボルグ

9

難しいのはスレッド化の部分ではなく、同期の必要性と、スレッドの使用に伴うすべてのことです。GUIの例では、データセットにアクセスする準備ができていることをメインスレッドにどのように伝えますか?コールバックの束全体をやり取りしますか?コード全体に多数のチェック変数を分散していますか?一部のGUIモデル(Silverlightなど)には、スレッドアフィニティと呼ばれるものがあります。これは、他のスレッドからメインスレッドに座っているGUI要素にアクセスできないため、特定の情報をメインスレッドに知らせる必要がありますさらに処理する準備ができています。

スレッドについて誤った話を聞いたことはありません。私は、使用しているアルゴリズムが本質的に並列でない場合に、同期が異常であるという状況的なケーススタディを読みました。


自己への注意:並列アルゴリズムを書く...ありがとう。
Droogans

メッセージキュー(MFCと同じ)。ただし、たとえメモリ内のデータを直接共有することによって、プログラマがメッセージキューを妨害しないようにすることは、たとえそれが発火可能な犯罪であっても失敗したようです。
rwong

3

スレッドはすべての問題を解決します

パフォーマンスの問題がある場合は、スレッド化にジャンプしないでください。

スレッドは軽量です

スレッドは数十から20代で軽量です。数千のスレッドを生成することはできません。

スレッド化は簡単[Java]

スレッドを作成するのは簡単ですが、それはあなたがそれから利益を得るという意味ではありません。


記録のためだけに、Mac OSでは(デフォルトのインストールで)512を超えるスレッドを作成できません。
zneak

1
それは本当にあなたの言語に依存します。Erlangで100万のスレッドを生成することは、最新のサーバーはもちろん、古いラップトップでもほとんど目立ちません。そして実際、これらは単なるスレッドではなく、本格的なプロセス、つまりスレッドよりもはるかに重いプロセスです。独自のプログラムカウンターとコールスタック(スレッドが持つ唯一のもの)に加えて、独自のヒープ、さらには独自のガベージコレクターも備えています。
ヨルグWミットタグ

4
@JörgW Mittag:あなたのコメントに混乱しています。OSがスレッドまたはプロセスを作成する方法は、アーランによってどのように変わりますか?
スティーブンエバーズ

1
@SnOrfus:ErlangはOSスレッドを使用しません。現在、3つの主要なErlang実装があります。BEAM、HiPE、およびErjangです。BEAMとHiPEはネイティブな実装で(OSがまったくなくても実行できます)、独自のプロセスを実装します。ErjangはJVM上で実行され、非常に素晴らしいKilimライブラリを使用してプロセスを実装します。
ヨルグWミットタグ

@JörgW Mittag:プログラマーの質問を考慮して、programs.stackexchange.com / questions / 28453 /…、これは非常に興味深いと思います。ありがとうございました。
スティーブンエバーズ

1

スレッドセーフではないライブラリ/関数の使用から生じるクレイジーなバグ(気づいていないもの)を修正するには、過剰な同期が必要になるため、最終的にはスレッド化による利益を失います。

バグが発生する可能性は非常に高く、スレッドを使用すると、使用しない場合は修正できなくなります。


修正不可能なバグ?私は前にそれらの1つを見たことがない..
10

修正できないバグを見たことはありませんか?時間内に利用できた給料のために?
カミルゾット

修正不可能なバグに遭遇したことがない場合は、業界に十分長くいません。私の12年以上の仕事の中で、私が見たすべてのプロジェクトには少なくとも1つのバグがあり、そのバグは誰も修正していません。これには、作業に使用したコードと読み取りアクセス権があるコード(オープンソースコード)が含まれます。バグのない唯一のソフトウェアは、2または3ページ未満の長さのソフトウェアです。しかし、すべてのコードを1ページまたは2ページ長くすると、統合バグが発生するため、何も解決できません。
スリーブマン14

1

スレッドを使用することは困難である理由賢明なポイントを要約しないように: -
真の物事1)は、同期、および慎重な設計上の決定ロックするかについてとロックする必要が
2を)実行時間の流れの制御なし
3)難しいデバッグ
4)(非常に少ないです回)プラットフォームの互換性:-これを処理するライブラリは存在します

偽物事: -
1)スレッドセーフと再入関数の概念混乱
2)スレッドが紙に良いに見えますが、実装するのは非常に困難です


これらは真実であるか、真実でないか?OPは、真実ではないことを尋ね、マルチスレッドプログラミングを行うことから人々を怖がらせます。
スティーブンエバーズ

実際には、ロックや同期は必要ありません。また、メッセージパッシングモデル(アーラン、スカラーなど)とSTMモデル(clojureなど)もあります。さらに、ロックを必要としないスレッドセーフデータ構造(JavaのConcurrentHashMap)と、ロックを必要としないアトミックプリミティブがあります。
ケビン

1

コードのテストを作成したくない場合は、スレッドを使用しないでください。

スレッドは、OSとコンピューターアーキテクチャの基礎を理解していない典型的な「コピーアンドペースト」プログラマー向けではありません。プログラマーの90%はJavaにしか精通していないため、これらはスレッドを使用すべき人ではありません。Javaはスレッドを「簡単」にしますが、同期構造を使用するとコードがスレッドで機能すると考えるプログラマーがたくさんいます。

そうは言っても、誰もがどこかから始める必要があります。会社のプロダクションバックエンドサーバーをアップグレードする最初のスレッドプロジェクトを作成しないでください。


スレッドを正しく行う方法に関するリソースをいくつかお勧めできますか?
ジョナサン

これは対処されたと確信しています。ここから始めてみてくださいstackoverflow.com/questions/660621/threading-best-practices
cmcginty

これの問題は、100%のテストカバレッジがある場合でも、命令が共有リソースとインターリーブする方法で起こりうるすべての問題をテストがカバーするかどうかを知る方法がないことです。一方、シェアードナッシングアーキテクチャを使用すると、はるかに簡単になります。
ザカリーK

1

例:プログラムはデータベースからデータセットをロードする必要があります。行うべきことは、接続を確立し、ワーカースレッドでデータベースからデータを取得してからGUIにロードし、GUIスレッドをユーザーに応答させることです。 。

この状況が、少なくとも4つの理由でスレッド化を使用する必要性を表しているとは思いません。

  1. データの取得は非常に高速である必要があります。

  2. 多くの基幹業務アプリケーションでは、ユーザーは結果を待っている1〜2秒でアプリケーションとは関係ありません。また、ユーザーは、目的のタスクを完了するためにデータが戻ってくるまで待つ必要があります。一方、クエリは、一度に1ページ分の情報のみを取得するようにインテリジェントにコーディングでき、他の最適化手法が応答時間を短縮できます。

  3. Webベースのインターフェイスでは、スレッドモデルに関してリンクをアクティブにすることができます。

  4. 認めるとおり、スレッディングは複雑さを増し、開発者の中には機能を追加したり、複雑なコードをデバッグしたりできない場合があります。

私の意見では、ソフトウェアの保守性と信頼性はコードの優雅さよりも組織にとって価値があるため、必要なときにスレッドを使用します。


1
最初のポイントは、分散コンピューティングの誤fallを思い出させます( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing)。非常に多くのユーザーは、ポイント2から1秒または2秒以上応答しないインターフェイスを待機する必要がある場合、乱暴にクリックを開始し、事態を悪化させます。
セキュア

@Secure、リンクは興味深いです。共有してくれてありがとう。インターフェースや、この日と時代の仕事全体にユーザーの焦点を常に捉えることができるかどうかはわかりません。E-Businessサイトでは、ユーザーがまったく離れないようにする必要があることに同意します。
-NoChance

私は焦点について話していません。ユーザーがボタンをクリックし、データベースが照会されるためにインターフェイスがフリーズするだけで、何かが行われたという視覚的な応答がなければ、一部のユーザーはもう一度ボタンをクリックしようとします。そしてまた。次に、他のボタンまたはオプションをクリックしてみてください。これを行う管理者がよく知っているはずです。
安全な

結果画面が最初に描画されたが、空で表示された場合はさらに悪化します。ほとんどの最新バージョンについては知りませんが、古いOutlookの検索結果は良い悪い例です。検索を開始すると、大きな検索ベースで数秒間「結果セットが空です」またはこのようなものが表示され、最初の結果が見つかったときに表示されます。焦りすぎていたり、急いでいる場合は、すでに何も存在しないと信じて、すでに次のフォルダに切り替えています。
セキュア

1
@Secure、あなたの主張がわかります。ここで説明しているのは、一貫性のないユーザーインターフェイスの良い例を示しています。説明したことは、ファイルを検索するときにも発生します。しかし、検索が既に開始されていることをユーザーに伝える以外に、これに対する答えは何ですか?
-NoChance
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.