[英]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.