c++ - if 条件下的互斥量

标签 c++ loops mutex

我有一个互斥体的问题...

这是我的代码的一般结构:

#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() 进行两次解锁是否会产生不良行为?

最佳答案

这就是为什么 C++ 有单独的锁和互斥类:锁是一个方便的 RAII 类,即使在抛出异常或其他白痴程序员添加新的 return 时,它​​也会确保你的互斥锁被解锁>/break/continue 进入程序。以下是该程序如何与 std::unique_lock 一起工作:

#include <mutex>
std::mutex m;

While(1){
    std::unique_lock<std::mutex> lock(m);
    if(global_variable1==1){
        //CODE GOES HERE
        if (err==error::eof){
            cout<<"error!"<<endl;
            continue;
        }
        int something=1;
        global_variable2=something;
    }
    lock.unlock();

    usleep(100000);
}

关于c++ - if 条件下的互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20586654/

相关文章:

c++ - 没有用于初始化 std::lock_guard<std::mutex> 的匹配构造函数

c++ - 在模板类中创建重载友元运算符的模板

c# - 托管 C++ 中的 List<Tuple<int, float>>

python - 检查输入是否是循环中的字符串

java - 获得无向图中所有节点组合对的最佳算法(需要提高时间复杂度)

javascript - 更紧凑的方法来做到这一点?

java - 是否有可能在 Java 中有效地实现 seqlock?

c++ - Pthreads 在互斥锁中间死亡

c++ - 非默认运算符 <=> 在 C++20 中不会生成 == 和 !=

c++ - 您可以将链接器/附加依赖项等复制到其他项目吗