C ++线程死锁

时间:2016-01-04 23:56:46

标签: c++ multithreading mutex deadlock condition-variable

我无法摆脱这种僵局。首先让我用文字解释我想要实现的目标:

  1. Main创建一个线程并等待线程第一次完成
  2. 线程尽可能多地从源获取锁定读取(填充缓冲区并将其标记为已满),仅在所有缓冲区已满时释放锁定,并在最后通知主要缓冲区已满
  3. Main获取锁并消耗2个缓冲区,最后将它们标记为可以自由填充并再次唤醒线程释放锁 等等。 (有一个对象(数组+ bool),数组I代表缓冲区,布尔变量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)
    
        }
    

    }

  4. 问题是该线程仅在第一次工作,然后main消耗2个缓冲区,线程再次获取锁定并且无限while(true)循环被锁定。

1 个答案:

答案 0 :(得分:1)

从查看代码开始,函数func_executed_by_thread()只会被调用一次。您必须在while(true)内创建多个线程,或者func_executed_by_thread()包含一个循环。