Welcome

首页 / 软件开发 / C语言 / linux下生产者与消费者C实现

linux下生产者与消费者C实现2015-02-23最近做毕设涉及到了生产者与消费者模型,这个东东只在操作系统课程上有点印象,于是花了点时间看了下《unix环境高级编程 》的线程部分,在此记录一下。

1.多线程的概念就不多说了,pthread.h头文件中包含的几个基本概念及函数:

pthread_t————线程ID数据类型,线程ID只在它所属的进程环境中有效;

int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, func(void), arg)————创建新的线程,若成功返回0设置tidp指向的单元为新线程的线程IDattr用来设置线程属性,一般默认为NULLfunc为新线程调用的入口函数,该函数只能有一个无类型指针参数arg,若要向函数传递多个参数,需要将所有参数放到一个结构中,再把结构地址传递给arg

pthread_t pthread_self(void)————获取自身线程ID

void pthread_exit(void *rval_ptr)———终止本线程,用rval_ptr指向的值作为退出码

int pthread_join(pthread_t thread, void **rval_ptr)————调用该函数的线程将阻塞,直到thread线程调用pthread_exit、从启动例程返回或被取消,rval_ptr将包含返回码

int pthread_cancel(pthread_t tid)————该函数用来请求取消统一进程中的其他线程

2.线程同步————互斥量、读写锁,条件变量

读写锁即共享——独占锁,适合于读的次数远大于写的情况,比较好理解,就不多说了。

条件变量由互斥量保护,线程在改变条件状态之前必须先锁定互斥量。

生产者与消费者模型用到了互斥量和条件变量,对队列进行读写,下面直接上代码:

队列操作(数据结构的内容),采用链式结构:

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <time.h> #include <unistd.h> #include <pthread.h>#define MAXLENGTH 10//the maxlength of queuetypedef char * datatype; typedef struct node {//define node datatype name; struct node *next; } node; typedef struct queue {//define queue node *front, *rear; int len; } queue;void queue_init(queue *q) { q->front = q->rear = NULL; q->len = 0; }voidqueue_put(queue *q, datatype new_name)  //入队 { node *mynode = (node *)malloc(sizeof(node)); mynode->name = new_name; mynode->next = NULL; if (q->rear) q->rear->next = mynode; q->rear = mynode; if (q->front == NULL) q->front = mynode; q->len++; }datatype queue_get(queue *q)   //出队 { node *mynode; datatype myname; if (q->front != NULL) mynode = q->front; myname = mynode->name; q->front = q->front->next; q->len--; free(mynode); return myname; }void queue_print(queue *q)  //print queue { node *tmp = q->front; while(tmp != NULL) { printf("%s ", tmp->name); tmp = tmp->next; } printf("n"); }