pthreads + smp



  • wenn ich folgenden code unter fedora 9 mit einen q6600 quadcore ausführen wird jeder core nur zu ~30% ausgelastet. Hat hier wer eine erklährung?

    #include <stdio.h>
    #include <time.h>
    #include <pthread.h>
    #include <unistd.h>
    
    int  g_counter=0;
    
    void * cb(void *a)
    {
            int fd =(int)(a);
            char *s="abcdefghijkl";
            while (1)
            {
                    for(int i = 0; i != 10; i++)
                            write(fd, &s[i], 1);
                    /*sleep(1);*/
            }
    }
    
    #define numt 100
    int main()
    {
            char c[13];
            c[12]='\n';
    
            int pipe_[2];
            pipe(&pipe_);
            pthread_t thread[numt];
            for(int i = 0; i != 10; i++)
                    pthread_create(&thread[i], NULL, cb, pipe_[1]);
            write(1, "start of loop\n", 14);
            while ( read(pipe_[0], &c, 12)> 0 )
            {
                    if (!strcmp(&c, "abcdefghijkl"))
                            printf("bad\n");
                    /*else
                            write(1, &c, 12);*/
            }
            write(1, "end of loop\n", 12);
    }
    


  • pthread-beginner schrieb:

    wenn ich folgenden code unter fedora 9 mit einen q6600 quadcore ausführen wird jeder core nur zu ~30% ausgelastet. Hat hier wer eine erklährung?

    und was hast du erwartet? Die CPU Auslastung hängt vom Scheduler ab, es hängt also von mehreren Parametern.



  • Du hast also 100 Threads, die auf eine Pipe schreiben und einen Thread, der von der Pipe liest. Der eine einsame Thread macht ausserdem ein strcmp, hat also mehr zu tun, als die anderen. Da denke ich mal, dass dieser 25% CPU-Last erzeugt, also eine ganze CPU benötigt und die restlichen schreiben halt, wenn der Haupthread mal wieder mit einem strcmp fertig ist und mal wieder was empfangen kann. Da sind die 30% etwa das, was ich erwarten würde.


Log in to reply