调用pthread_spin_destroy()时,释放了哪些确切的“资源”?

时间:2018-10-31 21:46:01

标签: c multithreading pthreads locking spinlock


我对phread_spin_destroy()函数有疑问。在posix标准中,其定义如下:

  

pthread_spin_destroy()函数应销毁锁引用的自旋锁,并释放该锁使用的任何资源。

因此,如果有2个功能。一个被许多线程调用的函数拥有一个控制轴并递增例如一个全局变量(在示例中称为 foo())。
而另一个函数(在示例中称为 > destroy()被调用),后者在第一个函数被调用并调用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类型的全局声明变量,并且在调用foo()之前,使用(pthread_spin_init(&LOCK,0))初始化LOCK。

在调用destroy()之前的输出符合预期:该函数非常缓慢地增加全局变量(因为sleep(2))。
但是,如果我调用destroy()函数,则没有任何变化。这部分让我感到困惑。
我的问题是: 我对pthread_spin_destroy()的理解是否错误?是否仅释放资源“ LOCK”(我的意思是这个pthread_spin_t LOCK变量)?
我希望自旋锁被破坏,其他线程可以像没有锁一样起作用。
预先谢谢你

1 个答案:

答案 0 :(得分:2)

pthread_spin_destroy()释放的资源是实现需要分配以实现作为pthread_spin_init()的一部分的自旋锁的任何资源(根据实现的不同,这些资源可能“根本没有”)。 / p>

在调用pthread_spin_lock()之后直到再次调用pthread_spin_destroy()之前,再次在锁上调用pthread_spin_init()是不确定的行为。它只是一个释放函数:除非完全完成了锁并且不需要再次锁定它,否则不要调用它(通常,您会在嵌入在另一个锁中的自旋锁上调用pthread_spin_destroy()您将要释放的数据结构)。