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 <pthread.h>
#define NUM_THREADS 5
/*initialize static mutex array*/
static pthread_mutex_t mutexes[NUM_THREADS] = ...?
Oder müssen sie dynamisch zugewiesen werden?
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_THREADS
obwohl 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.
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.