2010-09-14 31 views
2

也許有些奇怪。當我在多線程環境中使用STL ostringstream類時,我發現每個線程的執行時間隨着線程數量的增加而線性增加。我不知道爲什麼會發生這種情況。我嘗試檢查ostringstream源代碼,但找不到任何同步代碼。在ostringsstream中有沒有同步的地方?我用snprintf替換ostringsstream,性能大幅提高。我的操作系統是RHEL5.4 64BIT,我的服務器上有兩個xeon 5620 cpu。爲什麼ostringstream在多線程環境下無法正常工作

以下是運行結果 我使用1個和8個線程分別使用1000000個循環。左列是threadid,右邊是 運行時間。因此,隨着線程數量的增加,每個線程的運行時間也隨之增加。

[host]$./multi_thread 1 1000000 
1115760960:0.240113 
[host]$./multi_thread 8 1000000 
1105004864:8.17012 
1115494720:8.22645 
1125984576:8.22931 
1136474432:8.41319 
1094252864:8.73788 
1167944000:8.74504 
1157454144:8.74951 
1146964288:8.75174 

代碼列表如下

#include <iostream> 
#include <sstream> 
using namespace std; 

void * func(void * t) 
{ 
     int n = *((int *) t); 
     pthread_t pid = pthread_self(); 
     timeval t1, t2; 
     gettimeofday(&t1, 0); 
     for(int i = 0; i < n; i++) 
     { 
       ostringstream os; 
       /* 
        char buf[255]; 
        int ret = snprintf(buf, 30, "%d", 2000000); 
        buf[ret] = 0; 
       */ 
     } 
     gettimeofday(&t2, 0); 
#define DIFF(a, b) ((b.tv_sec - a.tv_sec) + (b.tv_usec - a.tv_usec)/1000000.0) 
     std::cout << pid << ":" << DIFF(t1, t2) << std::endl; 
#undef DIFF 

     return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
     int m, n =0; 
     m = atoi(argv[1]); 
     n = atoi(argv[2]); 
     pthread_t tid[m]; 
     for(int i = 0; i < m; i++) 
       pthread_create(&tid[i], NULL, func, &n); 
     for(int i = 0; i < m; i++) 
       pthread_join(tid[i], NULL); 
     return 0; 
} 
+2

你檢查過CPU利用率了嗎?如果兩個CPU都100%忙碌,你的服務器不能一次處理多個線程。否則,可能確實存在鎖定爭用。 – 2010-09-14 08:25:21

+0

同步處於'ostringstream'使用的語言環境類中,但我不確定如何刪除此依賴項。 – Ivo 2010-09-14 08:33:52

回答

1

這似乎是一個已知的問題。 Here是MSVC的解決方案:靜態鏈接。也許這也會在linux上運行。

或者(建議用於Sun Studio here),使流線程爲本地(而不是進程本地),以防止它們在每個線程被其他線程鎖定時鎖定它們。

1

Ostringstream在堆上分配內存。可能是OS動態分配受Mutex保護?