Note that there are some explanatory texts on larger screens.

plurals
  1. POwhy ostringstream could not work well in multithreading environment
    text
    copied!<p>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.</p> <p>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.</p> <pre><code>[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 </code></pre> <p>the code is list as below</p> <pre><code>#include &lt;iostream&gt; #include &lt;sstream&gt; using namespace std; void * func(void * t) { int n = *((int *) t); pthread_t pid = pthread_self(); timeval t1, t2; gettimeofday(&amp;t1, 0); for(int i = 0; i &lt; n; i++) { ostringstream os; /* char buf[255]; int ret = snprintf(buf, 30, "%d", 2000000); buf[ret] = 0; */ } gettimeofday(&amp;t2, 0); #define DIFF(a, b) ((b.tv_sec - a.tv_sec) + (b.tv_usec - a.tv_usec) / 1000000.0) std::cout &lt;&lt; pid &lt;&lt; ":" &lt;&lt; DIFF(t1, t2) &lt;&lt; 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 &lt; m; i++) pthread_create(&amp;tid[i], NULL, func, &amp;n); for(int i = 0; i &lt; m; i++) pthread_join(tid[i], NULL); return 0; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload