2013-08-05 2 views
1

Пусть следующий код:Что произойдет, если pthread_key_delete вызывается на ключ после неудачного 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: функция

pthread_key_delete() должен удалить нити специального ключа данных ранее возвращенное pthread_key_create().

С pthread_key_delete ожидает нить данные по конкретным ключевым ранее вернулся по pthread_key_create, боюсь, называя pthread_key_delete на ключ, который не был возвращен pthread_key_create может привести к непредсказуемому поведению.

ответ

2

Да, это неявно неопределенное поведение, поскольку стандарт, который вы связываете, не определяет, что происходит в этом случае использования.

SUSv7, однако, является явно в обсуждении pthread_key_delete, говоря прямо в CHANGE HISTORY for Issue 7, что:

Ошибка [EINVAL] для значения ключа не получается из pthread_key_create() или ключа удаляется с помощью pthread_key_delete(); это условие приводит к неопределенному поведению.

+0

О, боже мой, я просто понял, что прочитал старшую * Проблема 6 *, тогда как я намеревался прочитать более актуальную * Выпуск 7 *. В следующий раз я должен следить. –

+0

@VilhelmGray, справедливо. Я бы сказал, что это одно и то же неопределенное поведение в том, что SUSv7 более откровенен в этом. – pilcrow

+0

Да, я считаю, что, вероятно, в решении явно указать, что в таких случаях существует неопределенное поведение. –

1

Глядя на исходный код pthread_key_create и pthread_key_delete , кажется, что pthread_key_create возвращается в ячейку памяти и заполнение других полей «ключ» структуры, которая является непрозрачной, как и все остальное в POSIX.

pthread_key_delete ожидает, что поля структуры ключа будут заполнены/установлены с использованием достоверных данных для поиска местоположения памяти. Таким образом, кажется, что вызов pthread_key_delete после неудачного pthread_key_create вызывает неопределенное поведение. Вот еще одна ссылка, которая, по-видимому, поддерживает мнение.

How does pthread_key_t and the method pthread_key_create work?

Я надеюсь, что это помогает.

+0

Исходная база, которую вы выбрали в качестве примера, может быть не самой распространенной реализацией Pthread с точки зрения использования, не так ли? – alk

+0

Кроме того, код для 'pthread_key_delete()' linked не полностью соответствует спецификации POSIX. Например, он не будет возвращать 'EINVAL', если был передан нулевой ключ' pthread_key_t', и если ключ не был найден. – alk

+0

Ниже вы можете увидеть еще два примера для pthread_key_delete.c –