почему ostringstream не может хорошо работать в многопоточной среде - PullRequest
2 голосов
/ 14 сентября 2010

Может быть, что-то странное. Когда я использую класс Ostringstream STL в своей многопоточной среде, я обнаружил, что время выполнения каждого потока увеличивается линейно с увеличением номера потока. Я не знаю, почему это произошло. Я пытаюсь проверить исходный код ostringstream, но не смог найти код синхронизации. Есть ли место для синхронизации в ostringsstream? Я заменяю ostringsstream на snprintf, и преформность во многом увеличивается. Моя ОС RHEL5.4 64BIT, а на моем сервере установлено два процессора xeon 5620.

Следующий результат Я использую 1 и 8 ниток отдельно с 1000000 петель. левый столбец является нитью, а правый Продолжительность. Таким образом, становится очевидным увеличение времени выполнения на поток по мере увеличения номера потока.

[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 ]

1 голос
/ 14 сентября 2010

Ostringstream выделяет память в куче. Может быть, динамическое распределение ОС защищено Mutex?

1 голос
/ 14 сентября 2010

Кажется, это известная проблема. Здесь - решение для MSVC: статическое связывание. Возможно, это также будет работать на Linux.

В качестве альтернативы (рекомендуется для Sun Studio здесь ), сделайте потоки локальными (а не локальными), чтобы предотвратить их блокировку каждым потоком при доступе к ним другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...