Threadsichere Klasse



  • Hallo.

    Wie der Titel schon hindeutet, will ich wissen wie ich meine Klasse nun am Besten und sichersten zu einer Threadsicheren mache.

    Danke.



  • Georgius schrieb:

    Hallo.
    Wie der Titel schon hindeutet, will ich wissen wie ich meine Klasse nun am Besten und sichersten zu einer Threadsicheren mache.
    Danke.

    bietet dein betriebssystem sowas wie CRITICAL_SECTION an? dann kann deine klasse so ein ding als member kriegen, und jede methode macht am anfang nen aufruf wie EnterCriticalSection und am ende LeaveCriticalSection.
    kann aber zu teuer sein, für jedes einzelne objekt so eine CRITICAL_SECTION zu haben. manchmal macht man die auch zum static member der klasse. weniger speicher, dafür mehr gegenseitiges blockieren.
    und das locken besser nicht mit lock/unlock, sondern mit konstruktor und destruktor eines Lock-Objekts. ich machs mal vor.
    mal angenommen, diene klasse war bisher:

    class Foo
    {
       int x;
       public:
          int get()
          {
             return x;
          }
          void set(int _x)
          {
             x=_x;
          }
    };
    

    und dein BS ist windows.
    //linux

    class CriticalSection
    {
       CRITICAL_SECTON critSect;
       //sem_t critSect;
       public:
       CriticalSection()
       {
          InitializeCriticalSection(&critSect);
          //sem_init(&critSect,0,1);
       }
       ~CriticalSection()
       {
          DeleteCriticalSection(&critSect);
          //sem_destroy(&critSect)
       }
       void lock()
       {
          EnterCriticalSection(&critSect);
          //sem_wait(&critSect);
       }
       void unlock()
       {
          LeaveCriticalSection(&critSect);
          //sem_post(&critSect)
       }
    };
    class Lock
    {
       Criticalsection& critSect;
       public:
       Lock(CriticalSection& _critSect)
       :critSect(_critSect)
       {
          critSect.lock();
       }
       ~Lock()
       {
          critSect.unlock();
       }
    }
    class Foo
    {
       CriticalSection critSect;
       int x;
       public:
          int get()
          {
             Lock l(critSect);
             return x;
          }
          void set(int _x)
          {
             Lock l(critSect);
             x=_x;
          }
    }
    

    so ne klasse Lock ist bei boost auch dabei. aber wer mag schon plattformunabhängigen code?


Anmelden zum Antworten