違いはありますか
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
または
pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);
最初の方法のみを使用しても安全ですか?
注:私の質問は、ほとんどの場合、せいぜい数台のクライアントをサーバーに接続して、ワーカースレッドでの問い合わせを解決するだけの非常に小さなプログラムに関係しています。
回答:
古いバージョンのPOSIX標準では、初期化子を使用した最初のメソッドは、auto
変数が関数本体で定義された変数である場合ではなく、静的に割り当てられた変数でのみ動作することが保証されています。auto
変数であってもこれが許可されないプラットフォームを見たことはありませんが、この制限はPOSIX標準の最新バージョンでは削除されています。
static
あなたは可能性がある場合、それははるかに簡単にブートストラップコードを記述することができますので、バリアントは、本当に望ましいです。実行時にそのようなミューテックスを使用するコードを入力するときはいつでも、ミューテックスが初期化されていることが保証されます。これは、マルチスレッドのコンテキストでは貴重な情報です。
再帰的である、またはスレッド間だけでなくプロセス間で共有できるなど、ミューテックスに特別なプロパティが必要な場合は、init関数を使用する方法が適しています。
動的初期化を使用して、ミューテックスの属性をさらに設定できます。また、動的メソッドを使用できるのは、実行時に多数のミューテックスを追加する場合のみです。
ただし、静的アプローチがニーズに合っている場合は問題ありません。
malloc()
(または割り当てられているオブジェクトに属している)場合。
私はこのことから、これを引用したいと思いブック:
では
POSIX
、スレッド、ロックを初期化する2つの方法があります。これを行う1つの方法はPTHREAD_MUTEX_INITIALIZER
、次のようにを使用することです。pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
これにより、ロックがデフォルト値に設定され、ロックが使用可能になります。これを実行する動的な方法(つまり、実行時)は
pthread_mutex_init()
、次のように呼び出します。int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!
このルーチンの最初の引数はロック自体のアドレスですが、2番目の引数はオプションの属性セットです。自分で属性の詳細を読んでください。NULLを渡すと、デフォルトが使用されます。どちらの方法でも機能しますが、通常は動的(後半)メソッドを使用します。