2014-01-23 32 views
0

我正在使用std :: stringstream讀取/寫入二進制數據。並行讀取寫入C++字符串流

std::stringstream strm(std::stringstream::binary|std::stringstream::in|std::stringstream::out); 

    strm.write(...) //happens in one thread 
    strm.read(...) //happens in another thread 

C++標準是否保證並行讀取寫入字符串流的工作?或不。

+0

'std :: stringstream'的來源是否有互斥或原子? – woolstar

+0

我對'std :: stringstream'的特定實現不感興趣。我對標準的規格感興趣。 – nature1729

+0

如果「符合標準」的stdC++庫沒有互斥體或其他線程安全機制,那麼它很可能不是標準所要求的。 – woolstar

回答

0

我在/usr/local/pgi/linux86-64/13.10/include/CC/fstream.h的fstream.h文件中沒有提到互斥鎖。此外,在我使用< <運算符寫入輸出的程序中,如果在「相同」時間寫入文件,字符串流文件可以變爲交錯。

由於您正在閱讀和寫入同一個文件,我想行順序很重要?因此,我認爲你想要一個全局互斥鎖之間的線程。

喜歡的東西:

#include .... 

pthread_mutex_t FileMutex = PTHREAD_MUTEX_INITIALIZER; 

std::stringstream strm(std::stringstream::binary|...) 

int main() 
{ 

blah blah 

pthread_create(&threads, NULL, function, voidPtrToArguments); 

blah blah 

} 

void *function(void *voidPtrToArguments) 
{ 
blah blah some more 

pthread_mutex_lock(&FileMutex); 
strm.write(...); 
pthread_mutex_unlock(&FileMutex); 

} 

,然後同一個函數讀取。

+0

C++ 11標準是否說明了特定於並行行爲或'std :: stringstream'的任何內容?特定的實現是重要的;但我更關心'std :: stringstream'的規範。 – nature1729

+0

您是否正在尋找: 27.2.3線程安全[iostreams.threadsafety] 1併發訪問流對象(27.8,27.9),流緩衝對象(27.6)或C庫流(27.9.2) 除非另有說明(27.4),多線程可能導致數據競爭(1.10)。 [注意:數據競賽 導致未定義的行爲(1.10)。 - 結束註釋] 2如果一個線程使一個庫調用a將值寫入一個流,結果是另一個線程通過庫調用b從該流讀取 這個值,使得這不會導致數據競爭,然後a的 寫與b的讀取同步。 – chrisb2244

+0

抱歉,格式化程度很差 - 來源是http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf第980頁 – chrisb2244