UNIX编程:线程同步锁的一些属性

Posted 月人神话

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX编程:线程同步锁的一些属性相关的知识,希望对你有一定的参考价值。

线程的同步锁,比如互斥锁,条件量以及屏障等等都具有自己相关的一些属性。今天就来聊一聊这个topic。

首先,线程互斥锁有一个叫健壮性的属性,这个属性的原理如下:如果我们设置了健壮性的属性,则在线程获取锁的时候,如果这个锁被其他线程锁住了,并且其他线程在退出的时候,并没有解除这个锁,这样当前线程就会阻塞,同时返回一个特殊的状态:eownerdead。我们从这点可以得知,现在有三个状态需要检查,成功且不需要恢复锁,成功且需要恢复锁,不成功。

还有一个十分重要的互斥量的属性需要提及,是一个被称为递归锁的互斥量属性,通过对这个互斥量进行设定,能够实现同一个线程对当前的互斥量进行持续加锁。通过计数器,当加锁与解锁计数不一致的时候,不能释放锁。

下面我们来看一个通过递归互斥量来实现的代码例子:


首先在main函数里设置了互斥锁属性,激活了互斥锁的递归属性

UNIX编程:线程同步锁的一些属性

同时因为需要调用条件变量时候需要申请锁,当条件满足的时候,调用timeout函数,并且把时间设置为当前时间的后10秒,并且调用retry函数,同时传入arg参数。这里有一点先需要提一下,由于条件变量需要互斥量保护,所以这里将互斥量属性设为递归,是有用的,因为这样能保证timeout中的retry函数中的互斥量能够顺利地申请。

UNIX编程:线程同步锁的一些属性

再来看下获取当前时间的函数

UNIX编程:线程同步锁的一些属性

这个函数的目的在于获取当前的时间,并且把时间信息封装到timespec的结构体中。

我们需要重点解析的是timeout这个函数,由于主函数设定的逻辑,这函数的传入参数有两个,一个是时间信息when,还有一个是函数信息,本例子中是retry函数。

UNIX编程:线程同步锁的一些属性

这里可以看到,只有当when(设定执行时间,10s)大于当前时间,才有必要进入接下来的逻辑,如果when小于当前时间,则直接调用retry函数,说明已经超时。否则的话就进入内部逻辑。

这里首先先创建一个to_info的结构体,将传入的arg和函数信息传给这个结构体,并且将需要等待的时间设定为when-当前时间。饿安够创建线程,将这个to_info结构体传给time_helper函数。在我看来,这个函数接收到的信息时,arg,func以及还需要等待多久

然后这个函数就很简单了,主要做的事情就是线程等待需要wait的时间后,执行传入的参数。

总结一下,就是说这个retry函数会在未来由不同线程执行,但是如果已经超时,就直接执行。

以上是关于UNIX编程:线程同步锁的一些属性的主要内容,如果未能解决你的问题,请参考以下文章

多线程线程同步

UNIX环境高级编程笔记之线程

Unix系统编程_cha11.6_线程同步

UNIX网络编程:互斥锁和条件变量

java并发编程11.原子变量与非阻塞同步机制

线程/同步对象的属性对象