假设有以下代码:
pthread_key_t key;
pthread_key_create(&key, NULL); /* failure here */
pthread_key_delete(key);
如果pthread_key_create
失败,对pthread_key_delete
的调用是否被视为未定义行为?如果 pthread_key_create
被注释掉会怎样?
pthread_key_delete POSIX 标准的部分规定:
The pthread_key_delete() function shall delete a thread-specific data key previously returned by pthread_key_create().
由于 pthread_key_delete
需要 pthread_key_create
先前返回线程特定的数据 key ,因此恐怕会调用 pthread_key_delete
> 在 pthread_key_create
未返回的键上可能会导致未定义的行为。
最佳答案
是的,这是隐式未定义的行为,就您链接的标准没有定义该用例中发生的情况而言。
然而,SUSv7 在其对 pthread_key_delete
的讨论中是明确的,在其 CHANGE HISTORY for Issue 7 中明确表示。那:
The [EINVAL] error for a key value not obtained from pthread_key_create() or a key deleted with pthread_key_delete() is removed; this condition results in undefined behavior.
关于pthreads - 如果在 pthread_key_create 失败后对某个键调用 pthread_key_delete 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18064682/