У меня есть вопрос, касающийся функции 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)?
Я ожидаю, что спин-блокировка будет разрушена, а другие потоки могут действовать так, как будто блокировки нет.
Заранее спасибо