标签:style class blog code http ext
| 锁状态\需要加的锁 | 读模式加锁 | 写模式加锁 | 
| 读模式 | 允许 | 阻塞直到所有线程释放读锁 | 
| 写模式 | 阻塞直到写锁被释放 | 阻塞直到写锁被释放 | 
| 不加锁 | 允许 | 允许 | 
#include <stdio.h>
#include <pthread.h>
 
/* 自定义的条件 */
struct msg {
    struct msg *m_next;
    char *data;
};
 
struct msg *workq;    /* 定义一个消息队列 */
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;    /* 静态分配条件变量 */
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;   /* 静态分配互斥量 */
 
void process_msg(void)
{
    struct msg *mp;
 
    while (1)
    {
        pthread_mutex_lock(&qlock);
        while (workq == NULL)
        {
            /* 此函数把线程放到等待条件的线程列表上,然后对互斥量解锁
             * 函数返回时,互斥量再次被锁住
             */
            pthread_cond_wait(&qready, &qlock);
        }
         
        /* 从消息队列头取出一个消息 */
        mp = workq;
        workq = workq->m_next;
        pthread_mutex_unlock(&qlock);
 
        printf("%s\n", mp->data);   /* 打印收到的消息 */
    }
}
 
void enqueue_msg(struct msg *mp)
{
    pthread_mutex_lock(&qlock);
    mp->m_next = workq;                /* 新消息放队列头部 */
    workq = mp;
    pthread_mutex_unlock(&qlock);
    pthread_cond_signal(&qready);   /* 唤醒等待该条件的某个线程 */
}
 
void *thr_fn1(void *arg)
{
    process_msg();
}
 
void *thr_fn2(void *arg)
{
    struct msg msg1, msg2, msg3;
 
    msg1.data = "Hello world";
    msg2.data = "I love you";
    msg3.data = "This is a test!";
 
    /* 将消息放入队列 */
    enqueue_msg(&msg1);
    enqueue_msg(&msg2);
    enqueue_msg(&msg3);
}
 
int main(void)
{
    pthread_t tid1, tid2;
 
    pthread_create(&tid1, NULL, thr_fn1, NULL);
    pthread_create(&tid2, NULL, thr_fn2, NULL);
 
    pthread_join(tid1, NULL);
 
    return 0;
}
标签:style class blog code http ext
原文地址:http://blog.csdn.net/nestler/article/details/30476989