防止/解锁cout的互斥锁

时间:2015-02-10 07:05:08

标签: c++ stream mutex

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

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

问题: 如果你用^ C将正在进行的输出分解为cout,那么另一个对程序的调用将在输出到cout时崩溃,因为&#34; cout被锁定但是所有者已经死了&#34;。 如何以最简单的方式防止这种情况?在尝试将输出重定向到该流之前是否有任何方法可以检查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;
}

标准&#34;环境,输出可以用^ C打破,我能够再次运行程序输出到std :: cout。也就是说,似乎std :: cout的方向实现在我编写代码的实时操作系统中存在缺陷?

1 个答案:

答案 0 :(得分:-3)

如果您使用的是C ++ 11,则可以使用

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

功能。

但是,您不是很幸运,您可以使用平台/库相关代码

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

使用范围锁的另一个好主意。