如果在pthread_key_create失败后在键上调用pthread_key_delete会发生什么?

时间:2013-08-05 18:02:57

标签: 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被注释掉了怎么样?

POSIX标准的pthread_key_delete部分声明:

  

pthread_key_delete()函数应删除先前由pthread_key_create()返回的特定于线程的数据密钥。

由于pthread_key_delete需要pthread_key_create之前返回的特定于线程的数据密钥,因此我担心在未返回的密钥上调用pthread_key_delete pthread_key_create会导致未定义的行为。

2 个答案:

答案 0 :(得分:2)

是的,它是隐式未定义的行为,只要你链接的标准没有定义该用例中发生的事情。

然而, 在讨论pthread_key_delete时是明确的,在CHANGE HISTORY for Issue 7明确地说:

  

删除未从pthread_key_create()获取的键值的[EINVAL]错误或使用pthread_key_delete()删除的键;这种情况会导致不确定的行为。

答案 1 :(得分:1)

查看pthread_key_createpthread_key_delete的源代码 似乎pthread_key_create正在返回一个内存位置并填充“key”结构的其他字段,这与posix中的其他所有字段一样不透明。

pthread_key_delete期望使用有效数据填充/设置关键结构字段以搜索内存位置。因此,在失败的pthread_key_create导致未定义的行为后,似乎调用pthread_key_delete。这是另一个似乎支持意见的链接。

How does pthread_key_t and the method pthread_key_create work?

我希望这会有所帮助。