我创建了一个程序,需要禁用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上。 在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的其他外部库代码的方法。