0

最近、Delphi の代わりに C++ を使い始めました。そして、かなり違うように見えるものもあります。たとえば、Semaphores や CriticalSections などの変数を初期化する方法がわかりません。1. コンストラクタでクリティカル セクションを初期化するのはばかげています。すべてのインスタンスが、何も同期せずに独自のクリティカル セクションを使用するからです。2.グローバル変数を使用してフォームの作成時に初期化することも、完璧な解決策ではないようです。これを達成する方法を誰か教えてもらえますか?

重要なセクションが必要なものについての簡単な説明: さまざまなスレッドから ListBox を埋めたいと思います。The Semaphore : 異なるスレッドがマウスを動かしています。これは中断されるべきではありません。

ありがとう!

4

2 に答える 2

1

Delphi とは対照的に、C++ にはユニットの初期化/ファイナライズの概念がありません (ただし、それについては既にご存じでしょう)。

私たちに残されたものはごくわずかです。次の 2 つのことを区別する必要があります。

  • 変数を宣言する場所(グローバル、静的クラスメンバー、クラスメンバー、関数のローカル、関数内の静的-すべてをカバーしていると思います)
  • 変数を初期化する場所 (C API に関係しているため、初期化関数を自分で呼び出す必要があります)

事実、あなたの場合、変数を必要とするプログラムの他のすべての部分にアクセスできる限り、変数を宣言する場所はほとんど重要ではなく、初期化する必要がある場所に関する唯一の要件は次のとおりです。実際に使用を開始する前にそれ (つまり、他のスレッドを開始する前)。

あなたの場合、おそらくsingleton patternを使用します。しかし、C++ の場合、シングルトンは初期化中に競合状態に陥ります。それを回避する明確な方法はありません。したがって、シングルトンに加えて、マルチスレッド コンテキストでの使用を開始する前に、シングルトンが正しく作成されていることを確認する必要があります。あなたの意志getInstance()の開始時に単純な呼び出しを行うだけです(または適切と思われる他の場所で)。main()ご覧のとおり、これは変数を宣言する場所のみを処理し、初期化する場所は処理しませんが、残念ながら、C++ にはマルチスレッドに関して重要な制限があるため (仕様が不十分です)、それを回避する方法はありません。

要約すると、(うまくいく限り)やりたいことをして、心配するのはやめましょう。

于 2013-04-25T10:51:08.823 に答える