4

ウィキペディアのスレッドセーフの記事に出くわしました。特に、いくつかのレベルの安全性を区別します。

スレッドセーフ:複数のスレッドが同時にアクセスする場合、実装には競合状態がないことが保証されます。
条件付きで安全:異なるスレッドが異なるオブジェクトに同時にアクセスでき、共有データへのアクセスが競合状態から保護されます。

しかし、私には、両方の定義は同じことを言うための異なる方法のように見えます。どちらも、共有データに競合状態がないことを保証します。

誰かが違いを説明できますか?ありがとう。

4

1 に答える 1

3

この 2 つのケースでは、共有データは同じものではないことを理解する必要があります。

スレッド セーフとは、複数のスレッドから 1 つのインスタンスにアクセスすることです。したがって、共有データは、パブリック メソッドによってアクセスされる場合、そのクラスの任意のメンバーである可能性があります。インスタンス間で共有されるのではなく (インスタンスが 1 つしかないため)、スレッド間でのみ共有されます。

条件付き安全は、それぞれ独自のスレッドから異なるインスタンスにアクセスすることについて話します。データはインスタンス間で共有する必要があるため、集約メンバー (おそらく依存性注入によって提供される)、静的メンバー、または (外部) シングルトンのみにすることができます。

しかし、前述のウィキペディアの記事 ( Qt の記事は間違っています) のすべての引用を読むと、ウィキペディアが IBM の命名を誤って伝えている可能性があることがわかります。IBM による条件付きとは、クラス/API の一部のメソッドのみが threadsafeであること、または API が影響を与えることができない基盤となるサービスにスレッドセーフが依存していることを意味します (良い例を挙げてください)。スレッド共有データとインスタンス共有データを区別しないため、スレッドセーフとリエントラントの Qt 命名規則の方が適切なようです。

于 2013-02-18T16:07:27.930 に答える