pthreads - 如果在 pthread_key_create 失败后对某个键调用 pthread_key_delete 会发生什么情况?

标签 pthreads posix pthread-key-create

假设有以下代码:

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/

相关文章:

c - 段错误或 SizeOf 未正确使用

c - 在 C 中,在 pthread_create 中使用函数名时是否与使用引用相同?

c++ - 未定义的 pthread 引用甚至使用 lpthread 创建

c - 对 PTHREADS 过于偏执?

api - fork() 与 CreateProcess()。系统调用与 API?

C 初始化类型定义的结构指针

c - POSIX fopen(NULL ,"r")

c - 我不明白使用 pthread_key_create 的原因,你能告诉我为什么吗?

c - 线程已创建但无法相应工作

android - 在 C/C++ 中更改 Android 上的 native 线程优先级