Linux ·

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将按照下表的描述进行操作。

Linux C 互斥量mutex 使用记录 Linux 第1张

参与评论