pthread与互斥和条件变量(C ++)OOP

时间:2017-10-16 22:22:44

标签: c++ pthreads posix conditional-statements mutex

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);

0 个答案:

没有答案