Chinaunix首页 | 论坛 | 博客
  • 博客访问: 476558
  • 博文数量: 112
  • 博客积分: 2436
  • 博客等级: 大尉
  • 技术积分: 2769
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-04 19:48
文章分类

全部博文(112)

文章存档

2013年(7)

2012年(105)

分类: LINUX

2012-07-31 08:46:52

1、Unix线程可以使用的同步方法
 #1 互斥量(Mutex)
 #2 条件变量
 #3 读写锁
 #4 信号量(semaphore)
2、互斥量
 #1 保证同一时间只有一个线程访问数据
 #2 本质上讲,互斥量是一把锁,在访问共享资源之前加锁,访问完毕后释放锁
 
 ##1 创建互斥锁
  静态方式:pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
  动态方式:采用pthread_mutex_init()来初始化互斥锁
 ##2 注销一个互斥锁
  pthread_mutex_destroy()
 ##3 动态初始化Mutex
  @1 定义mutexattr对象:pthread_mutexattr_t mutexattr;
  @2 对mutexattr对象初始化:pthread_mutextattr_init()
  @3 对mutexattr对象进行修改:
    pthread_mutexattr_setprioceiling()
    pthread_mutexattr_setprotocol()
    pthread_mutexattr_setpshared()
    pthread_mutexattr_settype()
  @4 调用pthread_mutex_init(),使用mutexattr作为属性参数
    pthread_mutex_init(&mutex, &mutexattr)
  @5 销毁mutexattr对象
    pthread_mutexattr_destroy()
 ##4 锁操作主要包括:
  @1 加锁:pthread_mutex_lock()
  @2 解锁:pthread_mutex_unlock()
  @3 测试加锁:pthread_mutex_trylock()
 Note:
  @1 POSIX线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待
  @2 若线程在lock后unlock前被取消,锁将永远保持锁定状态,因此,如果在关键区段内cancel point存在,或者设置了异步取消类型,则必须在退出回调函数中unlock
  @3 锁机制不是异步信号安全的,即不应该在信号处理过程中使用Mutex,否则容易造成死锁
3、条件变量
 条件变量是利用线程间共享全局变量进行同步的一种机制,主要包括两个动作:
  @1 一个线程等待“条件变量的条件成立”而挂起
  @2 另一个线程使“条件成立”(给出条件成立信号)
 为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起
 #1 条件变量的创建
  ##1 静态方式:pthread_cond_t cond=PTHREAD_COND_INITIALIZER
  ##2 动态方式:pthread_cond_init()
 #2 条件变量的等待
  ##1 无条件等待:pthread_cond_wait()
  ##2 计时等待:pthread_cond_timewait()
 #3 唤醒其他等待的线程,触发条件有两种:
  ##1 pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时,按入对顺序激活其中的一个
  ##2 pthread_cond_broadcast()则激活所有等待线程
  
4、读写锁(共享-独占锁)
 一次只有一个线程可占有写模式的读写锁,但是可有多个线程同时占有读模式的读写锁
 
 #1 读写锁的创建与销毁
  pthread_rwlock_init()
  pthread_rwlock_destroy()
 #3 读写锁的操作
  pthread_rwlock_rdlock()
  pthread_rwlock_tryrdlock()
  pthread_rwlock_wrlock()
  pthread_rwlock_trywrlock()
  pthread_rwlock_unlock()
阅读(1836) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~