Linux マルチスレッド: スレッドセーフな同期と相互排他についての理解


  スレッドの安全性を検討する前に、クリティカル リソースの概念を理解してください。 クリティカル リソースは、一度に 1 つのプロセスのみが使用できるリソースです トイレと同様、一度に一人しか使用できません。したがって、プログラムが正常に実行できるように、重要なリソースへのアクセスを 合理的に 制御する必要があります 。これがスレッド セーフです。

  スレッド セーフティは、同期と相互排除の2 つの部分に分かれています。

1. 相互排除の理解

ミューテックスとは何ですか?

  相互排他は、プログラム動作の安全性を確保するためのものです。プログラムが重要なリソースを使用すると、他のスレッドはそのリソースを使用できなくなり、他のスレッドがそのリソースの使用を終了した後にのみ使用できるようになります。トイレと同じで、一人が使い終わった場合のみ二人目が入ることができ、そうでない場合は外で待つしかありません。

相互排他をどのように達成するか?

 (1) 相互排他ロックは通常、スレッドの相互排他を実現するために使用されます。このミューテックスは実際には 0/1 カウンターで、0 はクリティカル リソースが使用されていることを意味し、1 はクリティカル リソースがアイドル状態であることを意味します。

 (2) スレッド A がクリティカル リソースにアクセスしたい場合、ミューテックスがロックされているかどうかを確認し、ロックされている場合はクリティカル リソースが使用されていることを意味します。クリティカル リソースがロックされていない場合は、クリティカル リソースが現時点ではアイドル状態であり、スレッド A がそれを使用できることを意味します。スレッド A は、使用前に重要なリソースをロックする必要があります。スレッド A のみが自身で追加されたロックのロックを解除でき、他のスレッドはロックを開くことができません。

 (3) Aさんがトイレに行って鍵を閉めて、他の人が入ってこられず鍵を開けられない状態で、Aさんだけが鍵を開けることができるようなものです。したがって、ミューテックスは実際には実際のロックと非常によく似ています。

 (4)重要なリソースにアクセスする場合、アクセス可能であればロックし、リソースをアクセス不可としてマークしてから、正しく戻ります。現時点でリソースにアクセスできない場合は、ブロックされるか、エラーが返されます。

(5) 相互排他を実現するには、全員が同じロックを使用する必要がある ことが最も重要です自分の家のドアと同じように、家族全員が鍵を持っていますが、鍵は 1 つしかありません。一人一人が鍵を持っていたらごちゃごちゃになってしまいます。したがって、これは、ミューテックスも重要なリソースであることを証明するものであり、ミューテックスの動作の安全性が保証されなければなりません。

次に、同期についての理解

同期とは何ですか?

  同期はプログラム動作の合理性を確保するために行われます。同じ重要なリソースにアクセスするスレッドが複数ある場合は、誰が最初に実行するかという問題を計画する必要があります。そうしないと、重要なリソースを使用するために群がるときに問題が発生しやすくなります。複数の人がトイレを使いたいが、トイレが 1 つしかない場合は、数人がトイレを占有することがないように、全員が合理的にトイレを使用できるように、この時点で整列する必要があります。

同期を実現するにはどうすればよいですか?

 (1) 同期は、リソースへのアクセスをより合理的にすることです。たとえば、相互排他を実装する場合、リソースへのアクセスを安全にするために、アクセス前にリソースをロックし、アクセス後にロックを解除します。ただし、いつロックするか、いつロックを解除するか、この時点をどのように把握するかは同期の問題です。

(2) 同期には条件変数を使用しますが、これには多くのツールが含まれており、リソースアクセスの合理性を確保するためにどのツールを いつ使用するかを指定する必要があります

おすすめ

転載: blog.csdn.net/weixin_57761086/article/details/128797468