以下是代码:
....
typedef struct {
int buf[10];
long head, tail;
int full, empty;
pthread_mutex_t *mut;
pthread_cond_t *notFull, *notEmpty;
} queue;
int main(){
queue *que;
pthread_t sup, cut;
que = queueInit();
if(que == NULL){
fprintf(stderr, "Queue Init failed");
exit(1);
}
pthread_create(&sup, NULL, insertQueue, (void*) que);
pthread_create(&cut, NULL, insertQueue, (void*) que);
pthread_join(sup,NULL);
pthread_join(cut,NULL);
queueDelete(que);
return 0;
}
void *insertQueue(void *q)
{
queue *que;
int i;
que = (queue *)q;
for(i=0; i<20;i++){
// Get mutex lock on the queue
pthread_mutex_lock(&mut); // Question (i) I guess this line is wrong
while(que>full){
printf("Its full");
// pthread wait condition for queue not full
pthread_cond_wait(¬Full, &mut); // Question (ii)
}
queueAdd(que,i);
// Unlock the queue
pthread_mutex_unlock(&mut); // Question (iii)
// Send signal saying there is data to be read
pthread_cond_signal(¬Empty); // Question (iv)
usleeep(100000);)
return(NULL);
}
}
queue *queueInit(void){
queue *q;
q = (queue *)malloc(sizeof(queue));
if(q==NULL) return (NULL);
q->empty = 1;
q->full = 0;
q->head = 0;
q->tail = 0;
q->mut=(pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
// Set default condition
pthread_mutex_init(&mut,NULL); // Question v
// Condition for not null
pthread_mutex_init(¬Null,NULL); // Question vi
// Condition for not empty
pthread_mutex_init(¬Empty,NULL); // Question vi
return (q);
}
....
我在代码中提出了我的问题,即问题i - vi
我的感觉告诉我,我的论点是错误的,例如问题vi:
pthread_cond_init(notEmpty,NULL);
它应该是别的东西,而不是“(&amp; notEmpty,Null)”。
请帮忙。
答案 0 :(得分:2)
notNull
在两个地方写成notFull
。
notNull
和notEmpty
是条件变量而不是互斥量,应该初始化。
没有为notNull
和notEmpty
分配内存。
将queue
声明为:
typedef struct {
int buf[10];
long head, tail;
int full, empty;
pthread_mutex_t mut;
pthread_cond_t notFull;
pthread_cond_t notEmpty;
} queue;
然后保留所有&
个字符。这意味着你可以通过一次调用来动画整个游戏。
最后,我认为您的意思是while(que->full)
而不是while(que>full)
。
答案 1 :(得分:1)
当你已经有一个指针时,你不应该使用&
。改变这个:
// Set default condition
pthread_mutex_init(&mut,NULL); // Question v
// Condition for not null
pthread_mutex_init(¬Null,NULL); // Question vi
// Condition for not empty
pthread_mutex_init(¬Empty,NULL); // Question vi
到此:
// Set default condition
pthread_mutex_init(mut,NULL); // Question v
// Condition for not null
pthread_mutex_init(notNull,NULL); // Question vi
// Condition for not empty
pthread_mutex_init(notEmpty,NULL); // Question vi
注意{I}我收拾的&
。 mut
已经是一个指针,使&mut
试图获得指向pthread_mutex_t
的指针