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