我无法摆脱这种僵局。首先让我用文字解释我想要实现的目标:
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)
}
}
问题是该线程仅在第一次工作,然后main消耗2个缓冲区,线程再次获取锁定并且无限while(true)
循环被锁定。
答案 0 :(得分:1)
从查看代码开始,函数func_executed_by_thread()
只会被调用一次。您必须在while(true)
内创建多个线程,或者func_executed_by_thread()
包含一个循环。