C++ поток тупик
Я не могу выйти из этого тупика. Сначала позвольте мне объяснить словами, чего я хочу достичь:
- Main создает поток и ожидает его завершения в первый раз
- Поток получает блокировку, считывающую из источника столько, сколько он может (заполняет буферы и помечает их как полные), снимает блокировку только тогда, когда все буферы заполнены, и в конце он сообщает основной, что буферы заполнены.
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()
также содержит цикл.