完整的定义各种教科书,各种网上资料都有,这里就不写了,只写一下自己的理解。
因为内核空间也用到锁,但是本节介绍的都是用户空间的系统调用。
1,互斥锁:(
只用于线程)
一种可以允许单线程访问,不然就阻塞等待的标志。保证某个资源在同一时刻只能被同一个线程读写 。不然一般结果会是最后修改资源的线程的版本,这样产生一些会乱套。
(比如两个线程读取同一个数值,然后各自加1,再写回去,按道理,写回去的应该是原来的+2。但是如果两个线程同时读取,则读取的是相同的值,各自加1,得到的数都是原来的+1。结果不唯一。)
-
#include <pthread.h>
-
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
int pthread_mutex_destroy(pthread_mutex_t *mutex);
-
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
-
const pthread_mutexattr_t *restrict attr);
-
int pthread_mutex_lock(pthread_mutex_t *mutex);
-
int pthread_mutex_unlock(pthread_mutex_t *mutex);
2,条件变量: (只能用于线程)
一种可以让线程休眠等待某个条件,条件满足唤醒线程去检测这个条件是否真的满足的机制。整个过程等待的不是条件变量设定的那个参数值,而是应用程序自己定义的那个条件,条件变量只是一种唤醒等待线程的机制,免得线程在不停的轮询条件,消耗机器资源。
-
#include <pthread.h>
-
-
int pthread_cond_destroy(pthread_cond_t *cond);
-
int pthread_cond_init(pthread_cond_t *restrict cond,
-
const pthread_condattr_t *restrict attr);
-
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
下面Pthread_cond_wait
(&ndone_cond
, &ndone_mutex
);会先把mutex锁上,保证在进入休眠时条件与检测时相同,免得,在此中间发生一些变化,线程进入休眠会会再也检测不到。
-
Pthread_mutex_lock(&ndone_mutex);
-
while (!cond)
-
Pthread_cond_wait(&ndone_cond, &ndone_mutex);
-
/*do some thing! */
-
Pthread_mutex_unlock(&ndone_mutex);
唤醒信号也要上锁,(上面提到,等待者上锁后进入休眠又解锁)发送信号者能上锁成功,说明等待者已经就绪并且解锁,然后就给他发信号。
-
Pthread_mutex_lock(&ndone_mutex);
-
Pthread_cond_signal(&ndone_cond);
-
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) |