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

时间: 2024-08-28 06:44:06

linux C 互斥量mutex 使用记录的相关文章

linux系统编程:线程同步-互斥量(mutex)

线程同步-互斥量(mutex) 线程同步 多个线程同时访问共享数据时可能会冲突,于是需要实现线程同步. 一个线程冲突的示例 #include <stdio.h> #include <unistd.h> #include <pthread.h> #define Loop 1000000 //全局资然 int counter = 0; void *fun(void *argv) { int i; for (i = 0; i < Loop; i++) { counter

[线程同步互斥]互斥量Mutex

互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数的原型和使用说明. 第一个 CreateMutex 函数功能:创建互斥量(注意与事件Event的创建函数对比) 函数原型: HANDLECreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, BOOLbInitialOwner, LPCTSTRlpName

Linux下互斥量加锁与解锁操作的C代码实现

一.概述 在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心.在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性. 本文详细介绍了Linux下互斥量加锁与解锁操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考. 二.加锁与解锁函数及时间结构体介绍 1.加锁函数pthread_mutex_timedlock 函数原型:int pthread_mutex_timedlock(pthread_mutex_t *restrict

(转)经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

转--- 秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥量(mutex)

9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源的数量(带符号的32位) (2)信号量的使用规则 ①如果当前资源计数>0,那么信号量处于触发状态,表示有可用资源. ②如果当前资源计数=0,那么信号量处于未触发状态,表示没有可用资源. ③系统绝不会让当前资源计数变为负数: ④当前资源计数绝对不会大于最大资源计数 (3)信号量的用法 (4)相关函数

秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

windows多线程(六) 互斥量Mutex与关键段CriticalSection比较

一.关键段CS 和 互斥量Mutex 的相同点:都有线程拥有权 关键段和互斥量都有线程拥有权,即可以被一个线程拥有.在 前面讲关键段CS的文章中有说到,关键段结构体的第四个参数保存着拥有该关键段的线程的句柄,具体如下: typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control entering and exiting

线程同步---互斥量mutex

1. 问题引入:开两个线程同时对一个全局变量10万次做自加,结果会如何? #include <stdio.h> #include <string.h> #include <pthread.h> unsigned int g_cn = 0; void* thread_proc (void* arg) { unsigned int i; for (i = 0; i < 100000; i++) ++g_cn; return NULL; } int main (void