『生产者与消费者问题分析』
「原理」生产者生产产品,消费者消费产品。产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者 就必须等待。同样的,如果生产者生产了产品,而消费者没有去消费,生产者就要在消费者消费了产品之后再 生产。生产者和消费者之间既有同步的关系,又存在互斥的部分。
『互斥量(Mutex)』
「原理」互斥量是一个可以处于两态之一的变量:解锁和加锁。互斥量仅仅适用于管理共享资源或一小段代码。获 得锁的线程可以完成“读—修改—写”的操作,然后释放锁给其他线程。没获得锁的线程只能等待而不能访 问共享数据。“读—修改—写”组成一个原子操作,不会在中间被打断。
「使用方法」
pthread_mutex_t Mutex;声明Mutex;
int pthread_mutex_init(pthread_mutex_t* restrict mutex, const pthread_mutexattr_t *restrict attr);初始化Mutex。成功返回0,失败返回错误号;
int pthread_mutex_destroy(pthread_mutex_t* mutex);用来销毁由pthread_mutex_init初始化的 Mutex;
如果Mutex变量是静态分配的,也可以用宏定义PTHREAD_MUTEX_INITIALIZER初始化,相当于用 pthread_mutex_init初始化并且attr参数为NULL;
int pthread_mutex_lock(pthread_mutex_t* mutex);获得Mutex完成加锁操作。如果这时另一个线程已 经获得了这个Mutex,则该线程挂起等待。直到另一个线程释放这个Mutex;
int pthread_mutex_trylock(pthread_mutex_t* mutex);如果Mutex已被某个线程获得,该函数失败返回 EBUSY而不会使线程挂起等待;
int pthread_mutex_unlock(pthread_mutex_t* mutex);释放Mutex解锁;
「lock和unlock」
假设Mutex的值为1表示互斥锁空闲,此时某个线程调用lock可以获得锁,Mutex的值变为0表示互斥锁已 被某个线程获得,如果其它线程调用lock则挂起等待。
『条件变量(Condition Variable)』
「原理」条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包含两个动作:一个线程等待“条件 变量条件成立”而挂起,另一个线程使“条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使 用总是和一个互斥锁结合在一起。
「使用方法」
int pthread_cond_init(pthread_cond_t* restrict cond, const pthread_condattr_t *restrict attr);初 始化一个条件变量。成功返回0,失败返回错误号;
int pthread_cond_destroy(pthread_cond_t* cond);函数销毁一个条件变量;
如果cond变量是静态分配的,也可以用宏定义PTHREAD_COND_INITIALIZER初始化,相当于用 pthread_cond_init初始化并且attr参数为NULL;
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);一个线程 可以调用这个函数在一个条件变量上阻塞等待。这个函数有三个操作:释放Mutex,阻塞等待,当被唤醒 时重新获得Mutex并返回;
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, conststruct timespec *restrict abstime);函数还有一个额外的参数设定等待超时,如果达到了 abtime所指定的时刻仍没有被别的线程唤醒当前线程,就返回ETIMEDOUT;
int pthread_cond_signal(pthread_cond_t *cond);函数唤醒条件变量上另一个等待的线程;
int pthread_cond_broadcast(pthread_cond_t *cond);唤醒条件变量上的所有线程;
『生产者与消费者问题实现』
「说明」生产者生产一个产品放在单链表的表头上,消费者从表头上消费产品。
「运行结果」