Announcement

Collapse
No announcement yet.

effizientes Mutex gesucht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • effizientes Mutex gesucht

    Hallo,

    ich habe mir mit Visual C++ in einer Win32-Konsolenanwendung einen kleinen Thread-sicheren Zufallsgenerator geschrieben, der auf der Blockverschlüsselung XTEA basiert (mit etwas geänderter Erzeugung der Rundenschlüssel):

    Code:
    #include <windows.h>
    
    class PRNG {
        HANDLE mutex;
        unsigned x[2], c0, c1, xi;
    public:
        PRNG();
        unsigned getnumber();
    };
    
    PRNG::PRNG() {
        mutex = CreateMutex (NULL, FALSE, NULL);
        x[0] = x[1] = c0 = c1 = xi = 0;
    }
    
    unsigned PRNG::getnumber() {
        WaitForSingleObject (mutex, INFINITE);
        unsigned result;
        if (xi)
            result = x[--xi];
        else {
            if (++c0 == 0) ++c1;
            x[0] ^= c0; x[1] ^= c1;
            unsigned s = 0;
            for (int c=0 ; c<32 ; ++c) {
                s ^= 0xb7e15163 + c;
                x[1] += (x[0] << 4 ^ x[0] >> 5) + x[0] ^ s;
                s += 0x9e3779b9;
                x[0] += (x[1] << 4 ^ x[1] >> 5) + x[1] ^ s;
            }
            result = x[xi = 1];
        }
        ReleaseMutex (mutex);
        return result;
    }
    Nach langem Herumsuchen habe ich diesen Mutex-Mechanismus gefunden.
    Er funktioniert auch, aber leider ist das Mutex ziemlich uneffizient: ein Aufruf von getnumber() dauert glatt zehnmal so lang wie ohne Mutex

    Kann mir jemand eine andere Möglichkeit enpfehlen, die effizienter ist?

  • #2
    Welcher Prozess könnte in einer Konsolenanwendung den Thread stören?
    Der Mutex arbeitet nur innerhalb der Anwendung.
    Christian

    Comment


    • #3
      Welcher Prozess könnte in einer Konsolenanwendung den Thread stören?
      Einer, den ich mit CreateThread() selbst erzeuge, um z.B. beide Prozessorkerne für etwas Rechenintensives zu nutzen

      Comment


      • #4
        Gehe mal davon aus, dass das alles so ein bisssssschen theoretisch ist.
        Christian

        Comment


        • #5
          Naja, stimmt, dieses Zufallsgeneratorbeispiel ist theoretisch. Die Lösung wäre hier, dass jeder Thread sein eigenes PRNG-Objekt verwendet, die aber dann verschieden initialisiert werden müssen, das könnte man einfach so machen:

          Code:
          PRNG::PRNG (unsigned s) {
              x[0] = s;
              x[1] = c0 = c1 = xi = 0;
          }
          Aber ein effizientes Mutex zur Abstimmung der Prozesse ist doch auch von allgemeinem Interesse.

          Ich frage mich halt, ob dieses CreateMutex(), WaitForSingleObject() und ReleaseMutex() hier wirklich die beste Technik ist, oder ob es etwas geeigneteres gibt, das ich nicht kenne.

          Comment


          • #6
            Vielleicht ist da was dabei:
            Inter.Process Mutex
            Alternative Mutexe

            bye,
            Helmut

            Comment


            • #7
              Das sieht interessant aus. Danke

              Comment

              Working...
              X