为什么ostringstream在多线程环境中不能很好地工作 [英] why ostringstream could not work well in multithreading environment

查看:105
本文介绍了为什么ostringstream在多线程环境中不能很好地工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

也许有些奇怪.当我在多线程环境中使用STL ostringstream类时,我发现每个线程的执行时间随着线程数量的增加而线性增加.我不知道为什么会这样.我尝试检查ostringstream源代码,但找不到任何同步代码. ostringsstream中有一些同步的地方吗?我用snprintf替换了ostringsstream,性能大大提高了.我的操作系统是RHEL5.4 64BIT,服务器上有两个xeon 5620 cpu.

Maybe something is weird. When I use STL ostringstream class in my multithreading environment I found that the execution time of each thread increased linearly as the thread number increased. I don't know why this happened. I try to check the ostringstream source code but could not find any synchronization code. Are there some synchronization place in ostringsstream? I replace ostringsstream with snprintf and the preformance increase largely. My OS is RHEL5.4 64BIT and my server has two xeon 5620 cpu on it.

以下是运行结果 我分别使用1和8线程与1000000循环.左列是threadid,右列是 运行时间.因此,随着线程数的增加,每个线程的运行时间也相应增加.

The following is the running result I use 1 and 8 thread separately with 1000000 loops. the left column is threadid and the right is running time. So it's apparant the per thread running time increase as the thread number increase.

[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;
}

推荐答案

这似乎是一个已知问题. 此处是MSVC的一种解决方案:静态链接.也许这也可以在linux上使用.

It seems to be a known problem. Here is a solution for MSVC: linking statically. Perhaps this will also work on linux.

或者(建议用于Sun Studio 此处),将流设为本地线程(而不是本地进程),以防止它们在每个线程访问另一个线程时被每个线程锁定.

ALternatively (suggested for Sun Studio here), make the streams thread local (instead of process local) to prevent them from being locked by each thread as the other accesses them.

这篇关于为什么ostringstream在多线程环境中不能很好地工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆