linux C 互斥量mutex 使用记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C 互斥量mutex 使用记录相关的知识,希望对你有一定的参考价值。

一、互斥量 Mutex 主要包含一下几个函数:

1、int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

  初始化一个mutex,如果attr为NULL测按默认值初始化,另外还可以在定义互斥量的时候按照下面的方式初始化一个互斥量:

  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  

  一个被lock的信号量,可以直接被恢复到初始态而不产生错误。

2、int pthread_mutex_destroy (pthread_mutex_t *mutex);

  销毁一个 mutex ,只有空闲状态(没有被lock或者lock之后被unlock了)的mutex才可以被销毁,销毁一个被lock的信号量,将产生(16,Device or resource busy)错误;

  被销毁的信号量可以重新被初始化。

3、int pthread_mutex_lock (pthread_mutex_t *mutex) 与int pthread_mutex_trylock (pthread_mutex_t *mutex) 与int pthread_mutex_timedlock (pthread_mutex_t *mutex,const struct timespec *abstime) ;

 

  这三个个函数功能类似,都是锁定(获得)一个互斥量mutex,只不过pthread_mutex_trylock是非阻塞模式的函数会立即返回,pthread_mutex_lock与pthread_mutex_timedlock是阻塞模式;

  pthread_mutex_timedlock的超时等待时间abstime是绝对时间,可以按照如下方式设置:

void set_abswaittime(struct timespec*outtime, int ms)
{

  long sec ;
  long usec ;
  struct timeval tnow;
  gettimeofday(&tnow, NULL);
  usec = tnow.tv_usec + ms*1000;
  sec = tnow.tv_sec+usec/1000000;
  outtime->tv_nsec=(usec%1000000)*1000;
  outtime->tv_sec=sec;

}

 

4、int pthread_mutex_unlock (pthread_mutex_t *mutex);

  释放一个互斥量mutex,如果线程尝试解锁未锁定的互斥体,则pthread_mutex_unlock将按照下表的描述进行操作。

技术分享

 

参考资料:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html#tag_16_439

 








以上是关于linux C 互斥量mutex 使用记录的主要内容,如果未能解决你的问题,请参考以下文章

linux线程-使用互斥量同步

「技术干货」Linux内核中的互斥量——Mutex锁

Linux 多线程同步机制:互斥量信号量条件变量

C++11——线程库,互斥量,原子性库,条件变量

以Linux下的测试程序说明递归型互斥量和普通互斥量的区别

Linux互斥量&条件变量