阻止/解锁cout的互斥锁
prevent/unlock mutex lock of cout
从命令行执行的程序如下(执行在其他地方声明的命令):
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互斥。
使用作用域锁的另一个好主意。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- 阻止/解锁cout的互斥锁