问题 pthread_mutex_lock 如果它在 for 循环内则永远等待

problem pthread_mutex_lock wait forever if it is inside for loop

我有一个如下所示的函数,它获取两个指针、一个队列和一个命令,并将命令放入队列中。因为队列是两个线程之间的共享资源,所以我使用互斥锁。

int addtoQueue(Command_t* cmd,MyQueue_t* myQ){
    MyQueue_t *mq = myQ;
    pthread_mutex_lock(&mq->mu_queue);
    if(isFull(mq))
        return -1;
    insert(mq, cmd);
    pthread_mutex_unlock(&mq->mu_queue);
    pthread_cond_signal(&mq->cond);
    return mq->itemCount;
}

我在Google测试中写了一个测试程序如下。

TEST(QueueTest, AddOneElementToQueue) {
    MyQueue_t myQ;
    Command_t cmd;
    myQ.rear=0;
    myQ.front=0;
    myQ.itemCount=0;
    cmd.id=1;
    EXPECT_EQ(1, addtoQueue(&cmd, &myQ));
}


TEST(QueueTest, AddTenElementsToQueue) {
    MyQueue_t myQ;
    Command_t cmd[10];
    myQ.rear=0;
    myQ.front=0;
    myQ.itemCount=0;
    for(int i=0;i<9;i++){
        cmd[i].id=i;
        addtoQueue(&cmd[i], &myQ);
    }

    EXPECT_EQ(10, addtoQueue(&cmd[9], &myQ));
}

结果很奇怪,我将一个命令放入队列的第一个测试成功了,但第二个卡住了

pthread_mutex_lock(&mq->mu_queue)

line inside addtoQueue function.I 发现如果我在 for 循环中调用这个函数它会卡住。有什么问题?

其实我忘了初始化mutex和cond

TEST(QueueTest, AddTenElementsToQueue) {
    MyQueue_t myQ;
    Command_t cmd[10];
    pthread_mutex_init(&myQ->mu_queue, NULL);<-----here
    pthread_cond_init(&myQ->cond, NULL);<-------here
    myQ.rear=0;
    myQ.front=0;
    myQ.itemCount=0;
    for(int i=0;i<9;i++){
        cmd[i].id=i;
        addtoQueue(&cmd[i], &myQ);
    }

    EXPECT_EQ(10, addtoQueue(&cmd[9], &myQ));
}

添加这两行解决了所有测试都通过的问题