为什么ostringstream在multithreading环境下无法正常工作

也许有些奇怪。 当我在我的multithreading环境中使用STL ostringstream类时,我发现每个线程的执行时间随着线程数的增加而线性增加。 我不知道为什么发生这种情况。 我尝试检查ostringstream源代码,但无法find任何同步代码。 在ostringsstream中有没有同步的地方? 我用snprintfreplaceostringsstream,性能大幅提高。 我的操作系统是RHEL5.4 64BIT,我的服务器上有两个至强5620 CPU。

以下是运行结果我分别使用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; } 

Solutions Collecting From Web of "为什么ostringstream在multithreading环境下无法正常工作"

这似乎是一个已知的问题。 这是MSVC的解决方案:静态链接。 也许这也将在Linux上工作。

或者( 在这里为Sun Studio建议),使流线程本地(而不是进程本地),以防止它们被其他线程锁定。

Ostringstream在堆上分配内存。 可能是OS的动态分配是由一个Mutex保护的?