2

次のコードがあるとします。

pthread_key_t key;
pthread_key_create(&key, NULL);    /* failure here */
pthread_key_delete(key);

失敗した場合pthread_key_create、呼び出しは未定義の動作pthread_key_deleteと見なされますか? コメントアウトしたらどうですか?pthread_key_create

POSIX 標準のpthread_key_deleteセクションには、次のように記載されています。

pthread_key_delete() 関数は、以前に pthread_key_create() によって返されたスレッド固有のデータ キーを削除します。

は以前に によって返さpthread_key_deleteたスレッド固有のデータ キーを想定しているため、 によって返されなかったキーを呼び出すと、未定義の動作が発生する可能性があります。pthread_key_createpthread_key_deletepthread_key_create

4

2 に答える 2

3

はい、リンクする標準がそのユースケースで何が起こるかを定義していない限り、暗黙のうちに未定義の動作です。

しかし、SUSv7 は の議論で明確にpthread_key_delete述べており、Issue 7 の CHANGE HISTORY で次のように明確に述べています。

pthread_key_create() から取得されなかったキー値、または pthread_key_delete() で削除されたキーの [EINVAL] エラーは削除されました。この条件により、未定義の動作が発生します。

于 2013-08-07T18:14:21.077 に答える
2

pthread_key_createpthread_key_deleteのソース コードを見ると 、pthread_key_create がメモリ ロケーションを返し、「キー」構造の他のフィールドに入力しているように見えます。

pthread_key_delete は、メモリの場所を検索するために、キー構造体フィールドに有効なデータが入力/設定されていることを期待しています。そのため、失敗した pthread_key_create の後に pthread_key_delete を呼び出すと、未定義の動作が発生するようです。これは、意見によってサポートされているように見えるもう1つのリンクです。

pthread_key_t とメソッド pthread_key_create はどのように機能しますか?

これが役立つことを願っています。

于 2013-08-05T19:50:13.363 に答える