Statische pthreads-Mutex-Initialisierung

Lesezeit: 2 Minuten

Benutzer-Avatar
ManRow

Wie würde man mit pthreads in C ein statisches Array von Mutexes initialisieren?

Für einen einzelnen statischen Mutex scheint ich PTHREAD_MUTEX_INITIALIZER verwenden zu können. Aber was ist mit einem statischen Array von ihnen? Wie zum Beispiel in

#include &ltpthread.h&gt
#define NUM_THREADS 5

/*initialize static mutex array*/
static pthread_mutex_t mutexes[NUM_THREADS] = ...?

Oder müssen sie dynamisch zugewiesen werden?

Benutzer-Avatar
paxdiablo

Nein, Sie müssen sie nicht dynamisch erstellen. Sie können ein statisches Array verwenden, Sie müssen sie nur alle einrichten, bevor Sie sie verwenden. Du kannst tun:

#define NUM_THREADS 5
static pthread_mutex_t mutexes[NUM_THREADS] = {
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER
};

was fehleranfällig ist, wenn Sie sich jemals ändern NUM_THREADSobwohl das mit etwas wie behoben werden kann:

static pthread_mutex_t mutexes[] = {
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER
};
#define NUM_THREADS (sizeof(mutexes)/sizeof(*mutexes))

Alternativ können Sie es mit Code tun, wie zum Beispiel:

#define NUM_THREADS 5
static pthread_mutex_t mutexes[NUM_THREADS];

// Other stuff

int main (void) {
    for (int i = 0; i < NUM_THREADS; i++)
        pthread_mutex_init(&mutexes[i], NULL);
    // Now you can use them safely.

    return 0;
}

In all diesen Fällen werden sie korrekt eingerichtet, bevor Sie versuchen, sie zu verwenden. Eigentlich würde ich es tun, bevor du es tust irgendein Threading-Sachen, aber das ist nur meine Paranoid.

  • Im ersten Beispiel wird die Verwendung von NUM_THREADS ist nicht nötig. Es kann Ihnen helfen, bestimmte Fehler zu erkennen, aber auch bestimmte andere zu begehen.

    – rlibby

    28. Februar 2011 um 6:30 Uhr

  • Sie könnten auch BOOST_PP_ENUM verwenden, da es nur den c99-Präprozessor benötigt

    – Irgendein Korn

    28. Februar 2011 um 6:32 Uhr

Benutzer-Avatar
Jens Gustedt

Wenn Sie einen C99-konformen Compiler haben, können Sie verwenden P99 So führen Sie Ihre Initialisierung durch:

static pthread_mutex_t mutexes[NUM_THREADS] =
  { P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };

Dies wiederholt nur die Token-Sequenz PTHREAD_MUTEX_INITIALIZER, die angeforderte Anzahl von Malen.

Damit dies funktioniert, müssen Sie sich nur dessen sicher sein NUM_THREADS expandiert nicht zu einer Variablen, sondern zu einer dezimalen ganzzahligen Konstante, die für den Präprozessor sichtbar und nicht zu groß ist.

1180510cookie-checkStatische pthreads-Mutex-Initialisierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy