ZBLOG

下面代码中,条件变量显得有点鸡肋,请把它删了#include #include #include #include #include #include //添加信号量头文件 #define MAX_BUFFER_SIZE 50 #define MIN_BUFFER_SIZE 5 typedef struct Node { int data; struct N...

下面是删除了条件变量的代码:

#include #include #include #include #include #include //添加信号量头文件 #define MAX_BUFFER_SIZE 50 #define MIN_BUFFER_SIZE 5

typedef struct Node { int data; struct Node *next; } Node;

typedef struct Buffer { Node *head; Node *tail; int size; pthread_mutex_t mutex; sem_t empty; //定义空缓冲区信号量 sem_t full; //定义满缓冲区信号量 } Buffer;

int length[MAX_BUFFER_SIZE]; void buffer_init(Buffer *buffer) { buffer->head = NULL; buffer->tail = NULL; buffer->size = 0; pthread_mutex_init(&(buffer->mutex), NULL); sem_init(&(buffer->empty), 0, MAX_BUFFER_SIZE); //初始化空缓冲区信号量为MAX_BUFFER_SIZE sem_init(&(buffer->full), 0, 0); //初始化满缓冲区信号量为0 }

void buffer_put(Buffer *buffer, int data) { sem_wait(&(buffer->empty)); //等待空缓冲区信号量 pthread_mutex_lock(&(buffer->mutex)); Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->next = NULL; if (buffer->tail == NULL) { buffer->head = node; buffer->tail = node; } else { buffer->tail->next = node; buffer->tail = node; } buffer->size++; printf(“Produced %d (buffer size: %d)\n”, data, buffer->size); pthread_mutex_unlock(&(buffer->mutex)); sem_post(&(buffer->full)); //增加满缓冲区信号量 usleep(rand()%111111); }

int buffer_get(Buffer *buffer) { sem_wait(&(buffer->full)); //等待满缓冲区信号量 pthread_mutex_lock(&(buffer->mutex)); Node *node = buffer->head; int data = node->data; buffer->head = node->next; if (buffer->head == NULL) { buffer->tail = NULL; } buffer->size–; printf(“Consumed %d (buffer size: %d)\n”, data, buffer->size); free(node); pthread_mutex_unlock(&(buffer->mutex)); sem_post(&(buffer->empty)); //增加空缓冲区信号量 usleep(rand()%100000); return data; }

void *producer(void *arg) { Buffer *buffer = (Buffer *)arg; time_t start_time = time(NULL); for (int i = 0;difftime(time(NULL), start_time) <=100; i++) {

buffer_put(buffer, i);

} printf(“producers were tied! Stop the project.\n”); exit(0); return NULL;

}

void *consumer(void *arg) { Buffer *buffer = (Buffer *)arg; for (int i = 0; ; i++) { buffer_get(buffer); } return NULL; }

int main() { Buffer buffer; buffer_init(&buffer);

pthread_t producer_thread; pthread_t consumer_thread;

pthread_create(&producer_thread, NULL, producer, &buffer); pthread_create(&consumer_thread, NULL, consumer, &buffer);

pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL);

return 0;

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1600

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?