问题 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));
}
添加这两行解决了所有测试都通过的问题
我有一个如下所示的函数,它获取两个指针、一个队列和一个命令,并将命令放入队列中。因为队列是两个线程之间的共享资源,所以我使用互斥锁。
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));
}
添加这两行解决了所有测试都通过的问题