liquid
2014-01-12, 20:14:29
Hallo,
ich habe momentan folgendes Konstrukt bei mir:
typedef struct data {
pthread_mutex_t mutex;
unsigned i;
/* more stuff */
} data_t;
void function_a(data_t *d) {
pthread_mutex_lock(&d->mutex);
/* do stuff with d */
pthread_mutex_unlock(&d->mutex);
}
void function_b(data_t *d, unsigned i) {
pthread_mutex_lock(&d->mutex);
/* do stuff with d */
pthread_mutex_unlock(&d->mutex);
}
Es gibt zwei Threads, die function_a und function_b aufrufen. Der Mutex verhindert, dass die Threads gleichzeitig an den Daten in d rumfummeln.
Jetzt möchte ich aber folgendes haben.
Die Threads rufen function_b mit grundsätzlich monoton steigendem Index i auf. Grundsätzlich, da ein Thread manchmal schneller mit seiner Arbeit fertig ist, und somit eine Sequenz ala "..., 13, 14, 16, 15, 17, ..." entsteht.
In d befindet sich der Index, der als nächstes dran ist. Ich möchte nun, dass der Eintritt in function_b nur für denjenigen Thread möglich ist, der den richtigen Index liefert. Der andere Thread soll geblock werden, bis er "an der Reihe ist".
Ich habe mit dazu bereits die condition variables der pthread Bibliothek angesehen. Ich bin mir aber noch nicht ganz im Klaren wie ich das genau damit bewerkstelligen kann. Muss ich z.B. einen zusätzlichen Mutex einführen, oder geht das auch mit dem bisherigen.
Jemand eine Idee?
- liquid
ich habe momentan folgendes Konstrukt bei mir:
typedef struct data {
pthread_mutex_t mutex;
unsigned i;
/* more stuff */
} data_t;
void function_a(data_t *d) {
pthread_mutex_lock(&d->mutex);
/* do stuff with d */
pthread_mutex_unlock(&d->mutex);
}
void function_b(data_t *d, unsigned i) {
pthread_mutex_lock(&d->mutex);
/* do stuff with d */
pthread_mutex_unlock(&d->mutex);
}
Es gibt zwei Threads, die function_a und function_b aufrufen. Der Mutex verhindert, dass die Threads gleichzeitig an den Daten in d rumfummeln.
Jetzt möchte ich aber folgendes haben.
Die Threads rufen function_b mit grundsätzlich monoton steigendem Index i auf. Grundsätzlich, da ein Thread manchmal schneller mit seiner Arbeit fertig ist, und somit eine Sequenz ala "..., 13, 14, 16, 15, 17, ..." entsteht.
In d befindet sich der Index, der als nächstes dran ist. Ich möchte nun, dass der Eintritt in function_b nur für denjenigen Thread möglich ist, der den richtigen Index liefert. Der andere Thread soll geblock werden, bis er "an der Reihe ist".
Ich habe mit dazu bereits die condition variables der pthread Bibliothek angesehen. Ich bin mir aber noch nicht ganz im Klaren wie ich das genau damit bewerkstelligen kann. Muss ich z.B. einen zusätzlichen Mutex einführen, oder geht das auch mit dem bisherigen.
Jemand eine Idee?
- liquid