【问题标题】:How can I write to cout with blocking?如何通过阻塞写信给 cout?
【发布时间】:2013-12-05 20:20:55
【问题描述】:

我到处寻找示例并查看了 C++ 手册(我通过示例学习得最好)。

我需要的是一种可以写入标准输出并阻塞并发分配的方法。

有人建议我使用“受保护的 cout”,但我不知道这是什么意思。 最初我一直在使用's C's write,但这样做会失去一些分数。

我想到的其他解决方案是使用信号量来保护 cout,因此它一次只能打印一个线程。但我觉得那里有一个内置的 C++ ......

我们将不胜感激。如果不给我一个例子,请不要将我链接到http://www.cplusplus.com/ 的任何内容。我对 C++ 比较陌生,如果我是阅读 cplusplus.com 上 api 的专业人士,我不会问这个问题。

编辑: 有关我的问题的更多信息。 不允许使用 C++11。 我不允许任何第 3 方库。所以boost是不行的。必须执行此操作的机器是 Unix 机器。

最终编辑: itwasntpete 是最接近正确答案的,但我不能选择 cmets。 信号量是我必须走的路。 @Casey 是的,我正在使用教授编写的第 3 方库,它为我们简化了并发性。但是我们不允许使用其他库。对于试图提供帮助的人来说,将其作为一项规则更容易。对不起!

【问题讨论】:

  • IIRC 它依赖于操作系统和实现 ...
  • c++11 有空吗?
  • 完全阻塞是什么意思?防止线程相互覆盖?
  • 没有内置的,你必须自己做。既然你知道信号量,那么你也应该知道mutex
  • 如果没有“第三方库”,在 C++11 之前的 C++ 中,多线程是不可能的。看你用什么“第三方库”来实现并发,利用它的互斥机制提供对cout的独占访问。

标签: c++ multithreading concurrency thread-safety blocking


【解决方案1】:

我认为流没有内置任何同步功能。在 C++03 中, cout 甚至不一定是线程安全的。在 c++11 中它是但仍然不同步。

看到这个问题: Is cout synchronized/thread-safe?

【讨论】:

    【解决方案2】:

    C++11 支持线程,否则您可以使用依赖于操作系统的线程,或者更简单的方法可能是支持线程的库(例如 boost),并且采用统一的方式。

    提升:http://www.boost.org/doc/libs/1_38_0/doc/html/thread.html

    C++11:http://en.cppreference.com/w/cpp/thread

    【讨论】:

    • 这不是一个真正的答案。 OP询问防止不同线程相互干扰,而不是线程。 boost 1.38.0 也来自 2 月。 2009.
    • “写入标准输出并阻塞并发分配”?线程不会工作吗?
    • 以某种方式涉及线程,但问题是关于同步并发性。
    【解决方案3】:

    这里有一些代码可以做你想做的事。你需要将它与 boost_thread-mt 和 pthread 链接起来,可能像gcc -pthread test.cpp -o test -lboost_thread-mt

    您必须调整它以将其与您的线程库而不是 Boost 一起使用。

    #include <iostream>
    #include <boost/thread/mutex.hpp>
    #include <boost/thread/thread.hpp>
    
    class Debug {
        private:
        static boost::mutex mutex;
        std::ostream &os;
    
        public:
        Debug(std::ostream &os) : os(os)
        {
            mutex.lock();
        }
        ~Debug()
        {
            mutex.unlock();
        }
    
        template<typename T> friend const Debug& operator<<(const Debug &d, const T& x)
        {
            d.os << x;
            return d;
        }
    
        friend const Debug& operator<<(const Debug &d, std::ostream& (*x)(std::ostream&))
        {
            d.os << x;
            return d;
        }
    };
    
    boost::mutex Debug::mutex;
    
    using namespace std;
    using boost::thread;
    
    void f(int i)
    {
        Debug(cout) << "This is " << i << " a test" << endl;
    }
    
    int main()
    {
        thread t1(f, 1);
        thread t2(f, 2);
        thread t3(f, 3);
    
        t1.join();
        t2.join();
        t3.join();
        return 0;
    }
    

    【讨论】:

    • @TimZ。是的,我知道。我添加了一个编辑,说您需要将其调整为您的线程库。我无法使用我不知道的库编写示例代码,所以我使用了 Boost。
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多