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,在其第 7 期的更改历史中明确表示:

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

于 2013-08-07T18:14:21.077 回答
2

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

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

pthread_key_t 和 pthread_key_create 方法是如何工作的?

我希望这有帮助。

于 2013-08-05T19:50:13.363 回答