我遇到了互斥锁的问题......
这是我的代码的一般结构:
#include <mutex>
std::mutex m;
While(1){
m.lock();
if(global_variable1==1){
//CODE GOES HERE
if (err==error::eof){
cout<<"error!"<<endl;
//should I put a m.unlock() here??
continue;
}
int something=1;
global_variable2=something;
}
m.unlock();
usleep(100000);
}
基本上,我想安全地更改全局变量,所以我认为我需要使用互斥锁。我应该只在“if(global_variable1 == 1)”函数之后解锁互斥锁,但如果出现错误,则互斥锁将无法解锁。我可以在“继续”之前将其解锁吗?或者这会搞乱别的什么?可以为同一个mutex.lock()进行两次解锁会产生不良行为吗?
答案 0 :(得分:1)
这就是为什么C ++有单独的锁和互斥类:锁是一个方便的RAII类,它将确保你的互斥锁即使在抛出异常或其他一些白痴程序员添加新的return
/ {时也会被解锁{1}} / break
加入该计划。以下是此程序如何与continue
配合使用:
std::unique_lock
答案 1 :(得分:1)
不手动锁定/解锁互斥锁!而是使用一个守卫,例如std::lock_guard<std::mutex>
:守卫将在施工时获得锁定,并在毁灭后释放它。要限制锁定的时间,只需使用一个块:
while (true) {
{
std::lock_guard<std::mutex> cerberos(m);
// ...
}
sleep(n);
}