【问题标题】:pthread_cond_wait() not waiting, returning int 6pthread_cond_wait() 不等待,返回 int 6
【发布时间】: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


【解决方案1】:

malloc 函数只是分配内存。它不会使该内存包含有效的互斥锁或条件变量。您需要初始化它们。 (或者,更好的是,使用 new 和现代 C++ 线程结构。)

【讨论】:

  • 谢谢大卫。我添加了我的初始化函数并添加了 mutex 和 cond inits(我需要在初始化队列之前在 main() 中调用它)。
  • pthread_cond_init 接受pthread_cond_t *,你传递给它的是pthread_cond_t
猜你喜欢
  • 2023-03-30
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2019-02-28
  • 2021-12-01
  • 2019-01-18
相关资源
最近更新 更多