【发布时间】:2017-04-13 02:08:19
【问题描述】:
经典的生产者消费者程序。如果队列为空,当前尝试让消费者等待。队列是内存中的结构。我的 pthread_cond_wait() 函数有问题。我们不允许使用全局变量,因此我将 pthread_cond 和互斥锁存储在队列结构的内存中。 pthread_cond_wait() 正在将整数 6 返回到 condWaitCheck,这表明正在发生以下任一情况。
[EINVAL] cond、mutex 或 abstime 指定的值无效。
[EINVAL] 为同一条件变量上的并发 pthread_cond_wait() 或 pthread_cond_timedwait() 操作提供了不同的互斥锁。
[EINVAL] 在调用时,互斥锁不属于当前线程。
而且我似乎无法弄清楚哪个是我的问题。
typedef struct queue {
int element[MAX_QUEUE_SIZE];
int prod_id[MAX_QUEUE_SIZE];
int head;
int tail;
int remaining_elements;
pthread_mutex_t myMutex;
pthread_cond_t condConsumer;
pthread_cond_t condProducer;
} prod_cons_queue;
.
void queue_initialize( prod_cons_queue *q ){
q->head = -1;
q->tail = -1;
q->remaining_elements=0;
pthread_cond_init (q->condConsumer,NULL);
pthread_cond_init (q->condProducer,NULL);
pthread_mutex_init (q->myMutex,NULL);
}
.
void *consumerFunc(void* prodID) {
int condWaitCheck;
pthread_mutex_lock (&(((prod_cons_queue *)prodID)->myMutex));
if (((prod_cons_queue *)prodID)->remaining_elements == 0){
cout << "waiting in consumer..." << endl;
pthread_cond_wait(&(((prod_cons_queue *)prodID)->condConsumer), &(((prod_cons_queue *)prodID)->myMutex));
if (condWaitCheck!=0){
cout << "There was an error on pthread_cond_wait:" << condWaitCheck << endl;
}
}
cout << "unlocking from consumer... " << endl;
pthread_mutex_unlock (&((prod_cons_queue *)prodID)->myMutex);
return NULL;
}
.
int main (){
//Producer consumer queue initialized
prod_cons_queue *q = (prod_cons_queue*) malloc (sizeof(prod_cons_queue*));
//q->head = 42;
//********************** CREATE CONSUMER **********************
pthread_t consumer;
int conCheck;
conCheck = pthread_create(&consumer,NULL,&consumerFunc,(void*)q); //passing void pointer type variable q
if (conCheck!=0){
cout << "Error:unable to create thread," << conCheck << endl;
//exit(-1);
}
【问题讨论】:
-
我们能看到初始化互斥锁和条件变量的代码吗?
-
...放屁。这不是队列结构中的初始化吗?
-
您只需致电
malloc。你认为什么会初始化互斥锁和条件变量?
标签: c++ multithreading pthreads mutex producer-consumer