簡體   English   中英

如何使用阻塞向cout寫入?

[英]How can I write to cout with blocking?

我到處都在尋找示例,並查看了C ++手冊(通過示例,我學得最好)。

我需要的是一種可以通過阻塞並發分配來寫出標准的方法。

建議我使用“受保護的cout”,但我不知道這是什么意思。 最初,我一直在使用C的寫操作,但是這樣做會損失一些點。

我想到的其他解決方案是使用信號量來保護cout,因此它一次只能打印一個線程。 但是我感覺到那里有C ++內置的...

幫助將不勝感激。 而且,請不要在沒有給出示例的情況下將我鏈接到http://www.cplusplus.com/上的任何內容。 我是C ++的新手,如果我是cplusplus.com上的api專業人員,我不會問這個問題。

編輯:更多信息有關我的問題。 不允許使用C ++ 11。 我不允許任何第三方圖書館。 所以提振是不行的。 必須在其上執行的機器是Unix機器。

最終編輯:itwasntpete最接近正確答案,但是我不能選擇評論。 信號量是我必須走的路。 @Casey是的,我正在使用教授編寫的第3方庫,該庫為我們簡化了並發。 但是我們不允許使用其他庫。 通常,嘗試幫助的人更容易做到這一點。 抱歉!

我認為流沒有內置任何同步。 在C ++ 03中,cout甚至不一定是線程安全的。 在c ++ 11中,它是但仍未同步。

看到這個問題: cout是同步的/線程安全的嗎?

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

這是一些應該執行您想要的代碼。 您需要將其與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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM