web-dev-qa-db-ja.com

PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init(&mutex、param)

間に違いはありますか

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

または

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

最初の方法のみを使用しても安全ですか?

注:私の質問のほとんどは、せいぜいいくつかのクライアントをサーバーに接続し、ワーカースレッドで問い合わせを解決するだけの非常に小さなプログラムに関するものです。

77
Kalec

POSIX標準の古いバージョンでは、変数が関数本体で定義されたauto変数である場合ではなく、初期化子を使用する最初のメソッドは静的に割り当てられた変数でのみ動作することが保証されます。 auto変数に対してもこれが許可されないプラットフォームを見たことはありませんが、この制限はPOSIX標準の最新バージョンで削除されました。

staticバリアントは、bootstrapコードをはるかに簡単に記述できるため、必要に応じて本当に推奨されます。実行時にこのようなミューテックスを使用するコードを入力すると、ミューテックスが確実に初期化されます。これは、マルチスレッドのコンテキストでは貴重な情報です。

Init関数を使用する方法は、スレッド間だけでなく、再帰的またはプロセス間で共有できるなど、mutexに特別なプロパティが必要な場合に適しています。

63
Jens Gustedt

動的初期化を使用して、ミューテックスの属性をさらに設定できます。さらに、実行時に多数のミューテックスを追加する場合にのみ、動的メソッドを使用できます。

ただし、静的アプローチは、ニーズに合っていれば何も問題はありません。

7
Joe

これからこれを引用したいと思います book

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を渡すと、単にデフォルトが使用されます。 どちらの方法でも機能しますが、通常は動的な(後者の)方法を使用します。

3
Mari202

デフォルトのmutex属性が適切な場合、マクロPTHREAD_MUTEX_INITIALIZERを使用してmutexを初期化できます。

Mutexの属性を指定する場合は、動的な初期化を行ってください........

この効果は、エラー検査が実行されないことを除いて、NULLとして指定されたパラメーターattrを使用したpthread_mutex_init()の呼び出しによる動的初期化と同等です。

3
Ramesh Miriyala