如何用阻止写cout?

时间:2013-12-05 20:20:56

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

我到处寻找一个例子并检查了C ++手册(我通过例子学到了最好的东西)。

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

我被建议使用“受保护的cout”,但我不知道这是什么意思。 最初我一直在使用C的写作,但是这样做我失去了几点。

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

将非常感谢帮助。如果没有给我一个例子,请不要将我链接到http://www.cplusplus.com/的任何内容。我对C ++很陌生,如果我是专业人士在cplusplus.com上阅读api,我不会问这个问题。

编辑: 更多关于我的问题的信息。 不允许使用C ++ 11。 我不允许任何第三方图书馆。所以提升是不行的。必须执行的机器是Unix机器。

最终编辑: itwasntpete是最接近正确答案的,但我无法选择评论。 信号量是我必须去的方式。 @Casey是的,我正在使用教授编写的第三方库,它简化了我们的并发性。但是我们不允许使用其他库。对于那些试图帮助的人来说,这更容易。遗憾!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是一些应该做你想做的代码。您需要将其与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;
}