阻止/解锁cout的互斥锁

prevent/unlock mutex lock of cout

本文关键字:cout 解锁 阻止      更新时间:2023-10-16

从命令行执行的程序如下(执行在其他地方声明的命令):

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方向的实现似乎有缺陷?

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

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

功能。

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

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

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