也許有些奇怪。當我在多線程環境中使用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;
}
你檢查過CPU利用率了嗎?如果兩個CPU都100%忙碌,你的服務器不能一次處理多個線程。否則,可能確實存在鎖定爭用。 – 2010-09-14 08:25:21
同步處於'ostringstream'使用的語言環境類中,但我不確定如何刪除此依賴項。 – Ivo 2010-09-14 08:33:52