101

Is there any difference between

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Or

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Am I safe enough if I use only the first method ?

NOTE: My question mostly refers to very small programs where at the most what I'll do is connect several clients to a server and resolve their inquiries with worker threads.

4

4 に答える 4

81

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

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

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

于 2013-01-14T14:44:02.377 に答える
8

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

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

于 2013-01-14T14:16:37.080 に答える
6

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

ミューテックスの属性を指定したい場合は、動的初期化を使用します.......

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

于 2013-11-29T06:29:46.763 に答える