【问题标题】:prevent/unlock mutex lock of cout防止/解锁 cout 的互斥锁
【发布时间】:2015-02-10 07:05:07
【问题描述】:

我的程序是从命令行执行的,看起来像这样(执行在其他地方声明的命令):

int commandHandler::handleRequest(...)
{
  bool cmdresult = execute(output);
  if cmdresult
  {
    std::cout << output << std::endl;
  }
}

问题: 如果你用 ^C 中断正在进行的输出到 cout,对程序的另一个调用将在输出到 cout 时崩溃,因为“cout 已锁定但所有者已死”。 如何以最简单的方式防止这种情况发生?在尝试将输出重定向到该流之前,是否有任何方法可以检查 cout 是否被锁定,在这种情况下,解锁它?

如果我做一个这样的测试程序:

int  main(void)
{
  std::string output = "Superlongstringwouldbeprinted here... ";
  for(int i=0;i<40000;i++)
    {
      output.append("Superlongstringwouldbeprinted here... ");
    }
  std::cout << output  << std::endl;
}

在“标准”环境中,输出可以用 ^C 破坏,我可以再次运行程序并将输出输出到 std::cout。也就是说,在我正在为其编写代码的实时操作系统中,std::cout 方向的实现似乎存在缺陷?

【问题讨论】:

  • 我没有看到任何互斥锁?为什么你认为这是一个互斥锁问题? "cout is locked but the owner is dead" 来自哪里?
  • 来自嵌入式操作系统故障转储,它指向 std::cout

标签: c++ stream mutex


【解决方案1】:

如果你使用 C++11,你可以使用

std::mutex::lock() 
std::mutex::try_lock()
std::mutex::unlock()

函数。

然而,你没那么幸运,你可能会使用平台/库依赖代码

在 Linux 中,您可以使用 POSIX 互斥锁。

另一个使用作用域锁的好主意。

【讨论】:

  • ^C 通常不是 RAII 可以从中恢复的。
  • 好的,那该怎么做呢?
  • 可能使用异常?
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 2022-07-31
  • 2021-12-23
  • 2010-11-22
  • 1970-01-01
  • 2023-03-09
  • 2012-12-25
相关资源
最近更新 更多