C++ ostringstream在多线程环境中无法正常工作的原因

C++ ostringstream在多线程环境中无法正常工作的原因,c++,linux,multithreading,stl,pthreads,C++,Linux,Multithreading,Stl,Pthreads,也许有点奇怪。当我在我的多线程环境中使用STL ostringstream类时,我发现每个线程的执行时间随着线程数的增加而线性增加。我不知道为什么会这样。我试图检查ostringstream源代码,但找不到任何同步代码。OstringStream中是否有一些同步位置?我用snprintf代替ostringstream,性能大大提高。我的操作系统是RHEL5.4 64位,我的服务器上有两个xeon 5620 cpu 以下是运行结果 我分别使用1线程和8线程以及1000000个循环。左栏为threa

也许有点奇怪。当我在我的多线程环境中使用STL ostringstream类时,我发现每个线程的执行时间随着线程数的增加而线性增加。我不知道为什么会这样。我试图检查ostringstream源代码,但找不到任何同步代码。OstringStream中是否有一些同步位置?我用snprintf代替ostringstream,性能大大提高。我的操作系统是RHEL5.4 64位,我的服务器上有两个xeon 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;
}
#包括
#包括
使用名称空间std;
void*func(void*t)
{
int n=*((int*)t);
pthread_t pid=pthread_self();
时间值t1,t2;
gettimeofday(&t1,0);
对于(int i=0;istd::cout这似乎是一个已知的问题。这是MSVC的一个解决方案:静态链接。也许这也适用于linux


或者(建议用于Sun Studio),将streams线程设置为本地(而不是进程本地)防止它们在其他线程访问时被每个线程锁定。

Ostringstream在堆上分配内存。操作系统的动态分配可能受互斥锁保护吗?

您检查过CPU利用率吗?如果两个CPU都100%忙,您的服务器就无法同时处理那么多线程。如果没有,可能确实存在锁内容I同步在
ostringstream
使用的区域设置类中,但我不确定如何删除此依赖项。