c ++使用pthread对两个函数进行Mutex

时间:2014-04-05 10:32:34

标签: c++ multithreading events mutex producer-consumer

你好,我在c ++中遇到了mutex的问题

我有以下内容 code

我尝试做像消费者/制作人这样的事情,我有两个线程。第一个线程用于将一些二进制数据读入第一个或第二个缓冲区。第二个线程是theese数据的消费者。它工作正常,但我想将拆分读取函数ParseDataFromBuffer()分成两个函数,如下所示:

void ParseDataFromBuffer(){
    DWORD waitResult = WaitForSingleObject( eventToParse, INFINITE);
    //nejaky if
    /*
    Pokud je naplnen buffer 1 prazdny, pak ctu z bufferu2 a naopak
    Ihned pred zahajenim cteni posilam event pro buffer, aby moh pokracovat
    v plneni dalsiho bufferu
    */
    if(bufferOneIsClear == false){//ctu z bufferu 1
        waitResult = WaitForSingleObject( mutexBuffer1, INFINITE);
        SetEvent(eventToBuffering);
        cout<<"Reading from buffer 1.."<<endl;
        //Sleep(8000);                              //I dont want theese
        //cout<<"Buffer 1 is read.."<<endl;         // lines
        //ReleaseMutex( mutexBuffer1);              //....
        return;
    }
    if(bufferOneIsClear == true){//ctu z bufferu 2
        waitResult = WaitForSingleObject( mutexBuffer2, INFINITE);
        SetEvent(eventToBuffering);
        cout<<"Reading from buffer 2.."<<endl;
        //Sleep(7000);
        //cout<<"Buffer 2 is read.."<<endl;
        ///ReleaseMutex(mutexBuffer2);
        return;
    }
}

此功能适用于发布互斥:

    void ParseDataFromBufferEnd(){
    if(bufferOneIsClear == false){
        ReleaseMutex(mutexBuffer1);
        return;
    }
    if(bufferOneIsClear == true){
        ReleaseMutex(mutexBuffer2);
        return;
    }
}

在while循环中,我想要这样的东西:

void ThreadStartUp(){
    //while
    while(buffers->getContinueProcessing()){
        buffers->ParseDataFromBuffer();
        Sleep(8000);   //there i will parse data from buffer..
        buffers->ParseDataFromBufferEnd();
    }
}

编辑:我意识到,问题出在Sleep()函数中。我不知道为什么,但是在Sleep函数中的数字。方法ThreadStartUp()比Sleep()函数中的数字更大。在方法ReadDataFromPath中,它不会工作。不知道为什么..我认为事件功能会阻止这一点,但看起来,他们不会。

edit2:我从中得出结论,这个问题出现在互斥体中。你应该知道,互斥体可以在一个函数中使用而在其他函数中可以自由使用,但在我的情况下则不行。

有人能告诉我,我在哪里错过了吗?

由于

0 个答案:

没有答案