视觉工作室中的std :: cout sentry_base死锁

时间:2017-04-16 11:01:17

标签: c++

我创建了一个程序,需要禁用cout并执行一些颜色输出,然后重新启用cout。我使用旧的cout缓冲区创建一个ostream后,将cout重定向到一个字符串流。

std::stringstream ss;
std::ostream out(std::cout.rdbuf());
std::cout.rdbuf(ss.rdbuf());
//change color here.
out << "stuff";
//change color back.
std::cout.rdbuf(out.rdbuf());
std::cout << ss.rdbuf();

我遇到的问题是,如果另一个线程正在尝试输出到cout,则称为 sentry 的流缓冲区中的内部机制将被锁定在sentry_base上。 enter image description here 在cout上调用_Lock和_Unlock可以解决这个问题。

std::stringstream ss;
std::ostream out(std::cout.rdbuf());
std::cout.rdbuf()->_Lock();
std::cout.rdbuf(ss.rdbuf());
//change color here.
out << "stuff";
//change color back.
std::cout.rdbuf(out.rdbuf());
std::cout.rdbuf()->_Unlock();
std::cout << ss.rdbuf();

我的问题是:如何在不使用_Lock和_Unlock的情况下解决此问题?它们的问题在于它们不是标准的,所以我不能使用它们。

我需要一个可以使用传统std :: cout的其他外部库代码的方法。

0 个答案:

没有答案