Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439302
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 623
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-26 18:48
个人简介

在生存面前,那纯洁的理想,原来是那么脆弱不堪!

文章分类

全部博文(58)

文章存档

2022年(1)

2021年(1)

2019年(3)

2018年(6)

2017年(6)

2016年(14)

2015年(10)

2014年(16)

2013年(1)

我的朋友

分类: LINUX

2014-10-24 02:55:27

完整的定义各种教科书,各种网上资料都有,这里就不写了,只写一下自己的理解。
因为内核空间也用到锁,但是本节介绍的都是用户空间的系统调用。

1,互斥锁:(只用于线程
   一种可以允许单线程访问,不然就阻塞等待的标志。保证某个资源在同一时刻只能被同一个线程读写 。不然一般结果会是最后修改资源的线程的版本,这样产生一些会乱套(比如两个线程读取同一个数值,然后各自加1,再写回去,按道理,写回去的应该是原来的+2。但是如果两个线程同时读取,则读取的是相同的值,各自加1,得到的数都是原来的+1。结果不唯一。)

几个调用函数:

  1. #include <pthread.h>
  2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  3. int pthread_mutex_destroy(pthread_mutex_t *mutex);
  4. int pthread_mutex_init(pthread_mutex_t *restrict mutex,
  5.              const pthread_mutexattr_t *restrict attr);
  6. int pthread_mutex_lock(pthread_mutex_t *mutex);
  7. int pthread_mutex_unlock(pthread_mutex_t *mutex);

2,条件变量: 只能用于线程
  
一种可以让线程休眠等待某个条件,条件满足唤醒线程去检测这个条件是否真的满足的机制。整个过程等待的不是条件变量设定的那个参数值,而是应用程序自己定义的那个条件,条件变量只是一种唤醒等待线程的机制,免得线程在不停的轮询条件,消耗机器资源。

几个调用函数:

  1. #include <pthread.h>

  2. int pthread_cond_destroy(pthread_cond_t *cond);
  3. int pthread_cond_init(pthread_cond_t *restrict cond,
  4.               const pthread_condattr_t *restrict attr);
  5. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
下面Pthread_cond_wait(&ndone_cond, &ndone_mutex);会先把mutex锁上,保证在进入休眠时条件与检测时相同,免得,在此中间发生一些变化,线程进入休眠会会再也检测不到。

等待条件,满足后进行处理

  1. Pthread_mutex_lock(&ndone_mutex);
  2. while (!cond)
  3.      Pthread_cond_wait(&ndone_cond, &ndone_mutex);
  4.    /*do some thing! */
  5. Pthread_mutex_unlock(&ndone_mutex);
唤醒信号也要上锁,(上面提到,等待者上锁后进入休眠又解锁)发送信号者能上锁成功,说明等待者已经就绪并且解锁,然后就给他发信号。
  1. Pthread_mutex_lock(&ndone_mutex);
  2. Pthread_cond_signal(&ndone_cond);
  3. Pthread_mutex_unlock(&ndone_mutex);

3,信号量:
信号量在linux中有两种实现机制,System V版本 和 Posix版本)
  笼统的说信号量将信号机制(标志)直接量化为
非负数,来取信号时,大于0 就减少信号量,并返回。不够0就等,够需要的量就直接返回,信号量相应减少。 适合与进程间依据数量信号进行同步的模式。满足相应的数量才可继续向下执行。

  Posix 信号量有4种操作(include)
    1. 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);
    2. 等信号(wait),也可叫做挂起(suspend)int sem_wait(sem_t *sem);
    3. 给信号(signal)或发信号(post) int sem_post(sem_t *sem);
    4.清理(destroy) int sem_destory(sem_t *sem);


  System V 采用信号量集的形式(完成多个信号量操作):
包含文件
#include
#include
#include
int semget(key_t key, int nsems, int semflg);     创建信号量。
int semop(int semid, struct sembuf *sops, unsigned nsops);   操作信号量
int semctl(int semid, int semnum, int cmd, ...);     

(三种system Ⅴ的进程间通信机制:消息、信号量(semaphores)和共享内存。)

            


阅读(2878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~