一个线程间同步 + FIFO顺序操作链表的例子

如题:

生产者和消费者访问链表的顺序是FIFO,创建两个线程来操作这些数据:


#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>

struct msg {
    struct msg *next;
    int num;
};

struct msg *head;
struct msg *end;
struct msg *tmp;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;


void *consumer(void *p)
{
    struct msg *mp;

    for (;;) {
        pthread_mutex_lock(&lock);
        while (head == NULL)
            pthread_cond_wait(&has_product, &lock);
        mp = head;
        head = mp->next;
        pthread_mutex_unlock(&lock);
        printf("Consume %d\n", mp->num);
        free(mp);
        sleep(rand() % 3);
    }
}

void *producer(void *p)
{
    struct msg *mp;
    for (;;) {
        mp = malloc(sizeof(struct msg));
        mp->num = rand() % 1000 + 1;
        printf("Produce %d\n", mp->num);
        pthread_mutex_lock(&lock);
        if (head == NULL)
            head = mp;
        else
            end->next = mp;
        end = mp;
        end->next = NULL;
        pthread_mutex_unlock(&lock);
        //Queueprint();
        pthread_cond_signal(&has_product);
        sleep(rand() % 3);
    }
}

int main(int argc, char *argv[]) 
{
    pthread_t pid, cid;  

    srand(time(NULL));
    pthread_create(&pid, NULL, producer, NULL);
    pthread_create(&cid, NULL, consumer, NULL);
    pthread_join(pid, NULL);
    pthread_join(cid, NULL);
    return 0;
}


输出:

$ gcc test.c -o test
$ ./test
Produce 934
Consume 934
Produce 263
Produce 701
Consume 263
Produce 753
Consume 701
Produce 257
Produce 712
Consume 753
Produce 844
Consume 257
Consume 712
Consume 844



你可能感兴趣的:(一个线程间同步 + FIFO顺序操作链表的例子)