c++ - 我应该如何在一个函数中锁定 wxMutex 并在另一个函数中解锁它?

标签 c++ multithreading thread-safety wxwidgets mutex

我应该实现自己的日志记录类,以便在具有两个线程(主线程和可连接处理线程)的程序中使用。我不希望任何一个线程在另一个线程使用记录器时使用它,所以我想我应该使用 wxMutex。记录器必须像带有运算符 << 的 C++ ostream 一样工作,除了流操纵器函数(例如 std::endl)将指示记录器输出的结束。我想我需要一个递归互斥锁,以便当互斥锁被锁定时同一个线程可以继续输出。

问题(我认为)是互斥体没有完全解锁,因此当另一个线程尝试输出到记录器时,它会死锁。

我的代码中是否缺少某些内容?

class Logger{
  private:
    std::ostream* out;
    wxMutex* mut;
  ....
  public:
    template<class T>
    Logger& operator<<(T str){ // accept any type of input and lock outputting until finished
      if(out){
        if(mut->TryLock() == wxMUTEX_BUSY){ // if we didn't get lock
          mut->Lock(); // we block
        }
        if(out){
          (*out) << str;
          out->flush();
        }
        //mut->Unlock(); // leave locked until done outputting (use std::endl or similar)
      }
      return *this;
    }

    // accept stream manipulators and unlock stream output
    Logger& operator<<(std::ostream& (*pf) (std::ostream&)){
      if(out){
        if(mut->TryLock() == wxMUTEX_BUSY){
          mut->Lock();
        }
        (*out) << pf;
        out->flush();
        while(mut->Unlock()!= wxMUTEX_UNLOCKED);
      }
      return *this;
    }
};

最佳答案

如果您担心线程问题,您可以创建一个宏来确保在输出之前获取互斥锁并在输出之后释放。

类似于:

#define LOG(logger, output) \
    do { logger.lock(); logger << output; logger.unlock(); } while (0)

Logger my_logger;
int some_integer = 5;
LOG(my_logger, "Hello world!" << some_integer << std::endl);

关于c++ - 我应该如何在一个函数中锁定 wxMutex 并在另一个函数中解锁它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830206/

相关文章:

c++ - 对 vector 内的结构成员求和

c++ - 我的 C++ 编译器会优化我的代码吗?

ruby - 将线程 ID 添加到 ruby​​ 日志

python - Python 实例变量是线程安全的吗?

c# - 对象数组,在一个线程中更新并在另一个线程中读取

multithreading - 这种解决竞争状况的解决方案是什么?

c++ - 对内存中同一地址的写入之间可能存在数据竞争

c++ - OpenCV中获取像素值

c++ - 使用 ENet 从 Cereal 发送二进制数据的 StringStream

Java的ExecutorService性能