C++ поток тупик

Я не могу выйти из этого тупика. Сначала позвольте мне объяснить словами, чего я хочу достичь:

  1. Main создает поток и ожидает его завершения в первый раз
  2. Поток получает блокировку, считывающую из источника столько, сколько он может (заполняет буферы и помечает их как полные), снимает блокировку только тогда, когда все буферы заполнены, и в конце он сообщает основной, что буферы заполнены.
  3. Main получает блокировку и использует 2 буфера, в конце помечает их как свободные для заполнения и снова пробуждает поток, освобождая блокировку и так далее. (есть объект (array+bool), с массивом, который я представляю буфер, и с булевой переменной main/thread помечает буфер как пустой / полный). Что я сделал, это (реализовано в c++):

    mutex m; //mutex and condition variable are global variables
    condition_variable cv;
    
    void func_executed_by_thread(params){
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk);
        //put stuff inside buffers
        //mark buffer as full
        lk.unlock();
        cv.notify_one();
    }
    
    int main(int argc, char**argv){
        //allocating space for buffer
         std::thread worker(func_executed_by_thread,params);
        while(true){
            std::unique_lock<std::mutex> lk(m);
            cv.wait(lk);
            //get two buffer to consume
            //consume two buffer
            //mark these two buffer as empty
            lk.unlock();
            cv.notify_one();
            //do some other stuff that takes long time (but in the meanwhile the other thread should empty the other buffer)
    
        }
    

    }

проблема в том, что поток работает только в первый раз, затем основной использует 2 буфера, поток никогда не получает блокировку снова и бесконечное while(true) петля заблокирована.

1 ответ

Смотря на ваш код, функция func_executed_by_thread() вызывается только один раз. Либо вам придется создать несколько потоков внутри while(true) или есть func_executed_by_thread() также содержит цикл.

Другие вопросы по тегам