0

私の質問はこのスレッドに似ていますが、特定のスレッドで引き出された結論がここに当てはまるかどうかは確信しています。

私の使用例: アプリケーションには、1 秒ごとに同じテキスト情報を送信するステータス スレッドがあります。文字情報には、アプリケーション グループ名が含まれます。このステータスは、アプリケーション サーバーがオンかオフかを判断するためにステータス リーダーによって使用されます。

アプリケーション グループ名は、存続期間中に変更できるようになりました。ユーザー アクティビティが原因で、アプリケーション内の 1 つのスレッドだけがこのイベントをトリガーすることが保証されます。これで、この単一のスレッドに、ステータス スレッドに更新する必要がある新しいアプリケーション グループ名が付けられました。

私の現在の実装は次のとおりです

  1. ステータス スレッド Main() ReadLock の取得 アプリケーション グループ名の読み取り ReadLock の解放

    ステータスを送る

  2. Updater Thread Main() Taken write Lock グループ名の更新 WriteLock の解除

ただし、大量の更新が送信されるため、負荷が高いとパフォーマンスが低下するのではないかと心配しています。そのため、次の実装に取り​​組んでいますが、これが機能するかどうかはわかりません。

新しく提案された実装は

  1. 送信側スレッドは、char* ptr、char[1024] primaryData、char[1024] secondaryData を保持します。
  2. 初めてアプリケーションを起動すると、グループ名は primaryData で更新され、ptr は primaryData を指します。
  3. 更新スレッドが更新イベントを持っているときはいつでも、(ptr == primaryData) 新しいアプリケーション名を secondaryData にコピーします。 ptr = secondaryData そうでない場合は、新しいアプリケーション名を primaryData にコピーします。ptr = プライマリ データ
  4. ステータス スレッドは、常に ptr が指すデータを使用してステータスを送信します。ステータス スレッドは最終的に更新された ptr を受け取り (キャッシュの一貫性を考慮して)、新しいデータの送信を開始します。

ここで考慮すべき点がいくつかあります。1. 新しいデータがステータス スレッドですぐに利用できなくても問題ありません。 2. 無効なメモリ アクセスによるプログラムのクラッシュは避けたいです。

友達、上記のロジックが読み書きロックを回避するのに役立つかどうか教えてください。

4

2 に答える 2

1

単一のリーダーと単一のライターを使用するシナリオでの読み取り/書き込みロックは、単純な古いミューテックスと同じです。ミューテックスを使用するだけです。

于 2012-05-28T17:31:14.307 に答える
1

上記のロジックが読み書きロックを回避するのに役立つかどうか教えてください。

いいえ、このロジックではロックを回避できません。提案されたスキームは競合状態でいっぱいです。

私のアドバイスはchar、ステータス スレッドと更新スレッドで共有される 1 つの配列と 1 つのミューテックスを使用することです。これにより、簡単に正しく理解できる非常に単純なロジックが得られます。

これが容認できないロック競合につながることが判明した場合に限り、さらに最適化を検討する必要があります。

于 2012-05-28T16:20:52.103 に答える