Hello = D我有点遇到问题,我正在尝试使用pthread与互斥和cond变量来实现一个车库。通常我会在main中执行它,但因为我想用OOP扩展我的C ++技能,我想将它作为一个类来实现。
首先,我有一些用线程调用的方法。但是,由于void *在类中的工作方式,我必须将它们实现为静态或类外的函数。
问题是似乎互斥体和条件变量不会通信
void garage::start()
{
refresh = false;
pthread_create(&entryThread, nullptr, entryGuardThread, this);
for_each(carsThread.begin(), carsThread.end(), [&,this](pthread_t thread)
{
pthread_create(&thread, nullptr, &carThread, this);
});
}
这是在课堂上
void* carThread(void* in)
{
garage * temp = (garage*)in;
pthread_t uniqueThread = pthread_self();
while(!temp->refresh)
{
pthread_mutex_lock(&temp->entryLock);
temp->carWaitingAtEntry = true;
pthread_cond_signal(&temp->atEntry);
while(!temp->entryOpen)
pthread_cond_wait(&temp->atEntry, &temp->entryLock);
temp->carWaitingAtEntry = false;
pthread_mutex_unlock(&temp->entryLock);
temp->waiting(1);
}
return nullptr;
}
void* entryGuardThread(void* in)
{
garage * temp = (garage*)in;
while(!temp->refresh) {
pthread_mutex_lock(&temp->entryLock);
while(!temp->carWaitingAtEntry)
pthread_cond_wait(&temp->atEntry, &temp->entryLock);
temp->entryOpen = true;
pthread_cond_signal(&temp->atEntry);
while(temp->carWaitingAtEntry)
pthread_cond_wait(&temp->atEntry, &temp->entryLock);
temp->entryOpen = false;
pthread_mutex_unlock(&temp->entryLock);
}
return nullptr;
}
请注意函数作为类的朋友实现的原因,以便我可以访问私有变量(我知道它是愚蠢的,但我必须先让它工作)。我测试了它,两个函数都指的是同一个车库对象......
感谢所有帮助。
线程冻结在
while(!temp->entryOpen)
pthread_cond_wait(&temp->atEntry, &temp->entryLock);