假设以下代码:
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
会导致未定义的行为。
答案 0 :(得分:2)
是的,它是隐式未定义的行为,只要你链接的标准没有定义该用例中发生的事情。
然而, 在讨论pthread_key_delete
时是明确的,在CHANGE HISTORY for Issue 7明确地说:
删除未从pthread_key_create()获取的键值的[EINVAL]错误或使用pthread_key_delete()删除的键;这种情况会导致不确定的行为。
答案 1 :(得分:1)
查看pthread_key_create和pthread_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?
我希望这会有所帮助。