Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165445
  • 博文数量: 25
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 319
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-12 21:27
文章分类

全部博文(25)

文章存档

2015年(2)

2014年(1)

2013年(22)

我的朋友

分类: LINUX

2015-05-07 22:53:45

信号量(POSIX)

信号量是一个特殊类型的变量,可对其进行增加或者减少操作,对其的操作是原子操作。 

信号量一般分二进制信号量和计数信号量。二进制信号量其实就是计数信号量的一个特例。 

信号量可以对某一段代码进行保护,允许同一时刻最多指定个线程使用。而其二进制信号量和互斥量可以说是一样的。 

 

#include 

int sem_init(sem_t *sem,int pshared,unsigned int value); 

int sem_wait(sem_t *sem); 

int sem_trywait(sem_t *sem); 

int sem_post(sem_t *sem); 

int sem_destroy(sem_t *sem); 

 

sem_init:创建信号量并初始化其值。第一个参数为信号量对象,第二个参数表示是否允许其他进程共享该信号量,目前只能用0,第三个参数是信号量的值。 

sem_wait:以原子操作方式将信号量加一。 

sem_trywait:以原子操作方式尝试将信号量加一。 

sem_post:以原子操作方式将信号量减一。 

sem_destroy:清理信号量所拥有的资源。

 

 

互斥量

互斥量也是一特殊类型的变量,它如同一把锁,它允许开发人员锁住某个对象,使其在同一时刻只有一个线程可以访问之。

 

#include 

 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *nutexattr); 

int pthread_mutex_lock(pthread_mutex_t *mutex); 

int pthread_mutex_trylock(pthread_mutex_t *mutex); 

int pthread_mutex_unlock(pthread_mutex_t *mutex); 

int pthread_mutex_destroy(pthread_mutex_t *mutex); 

 

PTHREAD_MUTEX_INITIALIZER:静态分配互斥量。

pthread_mutex_init:创建互斥量,并设置互斥量的属性,NULL即可。 

pthread_mutex_lock:以原子操作方式给互斥量上锁。 

pthread_mutex_trylock:以原子操作方式尝试给互斥量加锁.

pthread_mutex_unlock:以原子操作方式给互斥量解锁。 

pthread_mutex_destroy:清除互斥量。 

 

 

条件变量

互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量分为两部分条件和变量。条件本身是由互斥量保护的。线程在改变条件状态前先要锁住互斥量。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步。

初始化条件变量。

 

#include 

 

pthread_cond_t cond = PTHREAD_COND_INITIALIER;

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

int pthread_cond_destroy(pthread_cond_t *cond);

 

静态态初始化,pthread_cond_t cond = PTHREAD_COND_INITIALIER;

动态初始化,int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

等待条件成立。释放锁,同时阻塞等待条件变量为真才行。timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait)

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

激活条件变量。pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程)

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有线程的阻塞

清除条件变量。无线程等待,否则返回EBUSY

int pthread_cond_destroy(pthread_cond_t *cond);

 


相关文章

, , , ,

阅读(2879) | 评论(0) | 转发(0) |
0

上一篇:进程之守护进程、僵尸进程、孤儿进程

下一篇:没有了

给主人留下些什么吧!~~