Какие именно «ресурсы» высвобождаются при вызове pthread_spin_destroy ()? - PullRequest
0 голосов
/ 01 ноября 2018


У меня есть вопрос, касающийся функции phread_spin_destroy (). В стандарте posix это определяется следующим образом:

Функция pthread_spin_destroy () должна уничтожить спин-блокировку, на которую ссылается блокировка, и освободить все ресурсы, используемые блокировкой.

Так что, если есть 2 функции. Одна функция, которая вызывается многими потоками, содержит spinock и увеличивает, например, глобальную переменную (в примере вызвана foo () ).
И другая функция (в примере destroy) () call), который вызывается одним потоком после вызова первой функции и вызова pthread_spin_destroy (). Эти функции могут выглядеть следующим образом:

void* foo(void* i) {
   pthread_spin_lock(&LOCK); //lock the spinlock
   sleep(2); //sleep a little
   globalvariable++; //increment
   printf("globalvariable: %d\n", globalvariable); //print for debug purpose
   pthread_spin_unlock(&LOCK); //spinlock gets unlocked
   return NULL;
}

void* destroy(void* i) {
    sleep(5); //sleep
    pthread_spin_destroy(&LOCK); //destroy the lock
    return NULL; //return
}

Обратите внимание, что "LOCK" является глобальной объявленной переменной типа pthread_spin_t и что LOCK инициализируется с помощью (pthread_spin_init (& LOCK, 0)) до вызова foo ().

Выходные данные перед вызовом destroy () соответствуют ожидаемым: функция очень медленно увеличивает глобальную переменную (из-за sleep (2)).
Но если я вызываю функцию destroy (), ничего не меняется. И эта часть меня смущает.
Мой вопрос: Правильно ли я понимаю pthread_spin_destroy ()? Это только освобождение ресурса "LOCK" (я имею в виду одну переменную LOCK pthread_spin_t)?
Я ожидаю, что спин-блокировка будет разрушена, а другие потоки могут действовать так, как будто блокировки нет.
Заранее спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Ресурсы, высвобождаемые pthread_spin_destroy(), - это любые ресурсы, которые реализация должна была выделить для реализации спин-блокировки как части pthread_spin_init() (которая, в зависимости от реализации, может быть «вообще отсутствует»).

Это неопределенное поведение - снова вызывать pthread_spin_lock() в замке после того, как вы позвонили pthread_spin_destroy(), до следующего вызова pthread_spin_init(). Это просто функция освобождения: не вызывайте ее, если вы полностью не заблокировали блокировку, и вам не нужно будет снова ее блокировать (обычно вы вызываете pthread_spin_destroy() для спин-блокировки, встроенной в другую структуру данных что вы собираетесь освободить).

...