- 同步
- 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。例:Mac端与手机端微信消息同步
- 同步在大多数情况下,是在实现了互斥的情况下,通过其他机制实现对共享资源的有序访问。极少数情况下可以多个访问者同时访问同一资源。
- 互斥
- 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能。
- 互斥技术可以用于解决诸如资源争用之类的冲突,还可以用于进程间的同步,使得它们可以合作。典型例子便是生产者/消费者模型。
- 互斥是指同一资源在同一时刻只允许一个访问者访问。
-
注意事项:
- 在编译中要加 -lpthread参数, 如:gcc thread.c -o thread –lpthread
- pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以使用库函数时,需要链接该库。
- 使用这些函数时,不要忘记加头文件#include<pthread.h>
- 如果使用sleep(),getpid()等函数时,需要加头文件#include<unistd.h>
- 在编译中要加 -lpthread参数, 如:gcc thread.c -o thread –lpthread
-
Peterson算法特点
- 使用两个全局变量(flg[]和turn)
- Flg[]表示哪个进程正在占用临界区及临界区的状态
- Turn表示能进入临界区的进程序号
- 此算法涉及两个原则:
- 忙则等待
- 空闲让进
- 使用两个全局变量(flg[]和turn)
-
临界缓冲区问题
- 有一个或者多个生产者产生某种类型的数据(记录、字符),并放置在缓冲区中;有一个消费者从缓冲区中取数据,每次取一项;系统保证避免对缓冲区的重复操作,也就是说,在任何时候只有一个代理(生产者或者消费者)可以访问缓冲区。
-
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
- 作用:互斥的条件等待,阻塞线程
- 参数:*cond是指向一个条件变量的指针
*mutex则是对相关的互斥锁的指针
-
int pthread_cond_signal(pthread_cond_t *cond)
- 作用:发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行
- 参数:*cond是指向一个条件变量的指针
void *producer()
{
pthread_mutex_lock(&the_mutex); //加锁
while(buff != 0)
{
pthread_cond_wait(&condP, &the_mutex); //阻塞等待
}
buff = i; //生产产品
pthread_cond_signal(&condC); //通知消费者消费产品
pthread_mutex_unlock(&the_mutex);
}
void *consumer(void *ptr)
{
pthread_mutex_lock(&the_mutex);
while(buff == 0)
{
pthread_cond_wait(&condC, &the_mutex); //阻塞等待
}
buff = 0; //清空缓冲区
pthread_cond_signal(&condP); //通知生产者生产产品
pthread_mutex_unlock(&the_mutex);
}
网友评论