PTHREAD_MUTEX_INITIALIZERとpthread_mutex_init(&mutex、param)


89

違いはありますか

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

または

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

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

回答:


72

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

staticあなたは可能性がある場合、それははるかに簡単にブートストラップコードを記述することができますので、バリアントは、本当に望ましいです。実行時にそのようなミューテックスを使用するコードを入力するときはいつでも、ミューテックスが初期化されていることが保証されます。これは、マルチスレッドのコンテキストでは貴重な情報です。

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


8

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

ただし、静的アプローチがニーズに合っている場合は問題ありません。


さらに、実行時に多数のミューテックスを追加する場合にのみ、動的な方法を使用できます。」では、これはどういう意味ですか?説明するのが難しい場合の小さな例は?
Kalec、2014年

1
@Kalec:mutexが割り当てられているmalloc()(または割り当てられているオブジェクトに属している)場合。
Michael Burr

3
@Kalecミューテックス変数「ロック」が構造の一部である場合、1番目のアプローチに従うことはできません。pthread_init()を使用する必要があります。
pankaj kushwaha

7

私はこのことから、これを引用したいと思いブック

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


4

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

mutexの属性を指定する場合は、動的初期化を使用してください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.