不改變使用習慣的情況下爲std::stream對象的輸入輸出操作附加線程安全

我們常常會使用std::cout 之類的對象在程序中輸出一些信息,如:
std::cerr <<  "error:  " << "invalid parameter. [" << __FILE__ << ":"  << __LINE__ <<  “]”  << std::endl;
這在記錄日誌時比較常用,如果要加入線程安全該怎麼辦呢?線程安全不是指單個的<<操作的安全,而是整個語句的線程安全,一般會通過宏寫成如下之類的型式:
boost::mutex mutex_cout;
#define tscout(x) {boost::mutex::scoped_lock lock(mutex_cout); std::cout << X; }
用起來就像這樣:tscout ( "error:  " << "invalid parameter. [" << __FILE__ << ":"  << __LINE__ <<  “]”  << std::endl)

其實通過for語句中可以定義區域變量這一特性,完全可以做到不改變使用習慣:
boost::mutex mutex_cout;
#define tscout for(boost::mutex::scoped_lock lock(mutex_cout); lock.locked(); lock.unlock()) std::cout
用法不變:
tscout <<  "error:  " << "invalid parameter. [" << __FILE__ << ":"  << __LINE__ <<  “]”  << std::endl;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章