赞
踩
针对典型的生产者和消费者问题,使用OpenMP编程,实现生产者生成随机数,由消费者求和并打印的操作。
数据竞争问题:当有多个生产者向同一个缓冲区写数据,以及有多个消费者从同一个缓冲区读取数据时,存在数据竞争的问题。
生产者消费者问题:生产者向缓冲区发送数据,消费者从缓冲区取出数据,但是当缓冲区满时,生产者不能发送数据,当缓冲区为空时,消费者不能从缓冲区取出数据。
设计一个缓冲区的队列结构,生产者向队尾发送数据,消费者从队头取数据。数据结构中包含队头和队尾指针(用整数模拟,用数组模拟循环队列)。为了提高并行度,队列使用两个锁(队头锁和队尾锁)实现互斥,以解决数据竞争的问题,这样生产者和消费者就可以同时进行操作。如果只使用一个锁,那么对整个队列的操作都是互斥的,生产者和消费者的操作不能同时进行。
// messege_queue structure
struct messege_queue{
int *msg;
int front;
int back;
omp_lock_t front_mutex;
omp_lock_t back_mutex;
};
1.初始化函数:
初始化锁,消息队列的分配,和相关的变量:
// initiatl every thread and its messege_queue
void initial(messege_queue* init){
init->msg = (int*)malloc(sizeof(int)*MAX_MESSEGE_QUEUE_SIZE);
init->front = 0;
init->back = 0;
omp_init_lock(&(init->front_mutex));
omp_init_lock(&(init->back_mutex));
}
2.销毁函数:
销毁锁,释放队列的空间:
// destroy every thread and its messege_queue
void destroy(messege_queue* dstry){
free(dstry->msg);
omp_
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。