Код: https://github.com/remzi-arpacidusseau/ ... reads-bugs
В главе32, домашнее задание 8, он использует глобальный замок для предотвращения тупика. Кодовый вектор-avoid-hold и wait.c ниже:
Код: Выделить всё
void vector_add(vector_t *v_dst, vector_t *v_src) {
// put GLOBAL lock around all lock acquisition...
Pthread_mutex_lock(&global);
Pthread_mutex_lock(&v_dst->lock);
Pthread_mutex_lock(&v_src->lock);
Pthread_mutex_unlock(&global);
int i;
for (i = 0; i < VECTOR_SIZE; i++) {
v_dst->values[i] = v_dst->values[i] + v_src->values[i];
}
Pthread_mutex_unlock(&v_dst->lock);
Pthread_mutex_unlock(&v_src->lock);
}
< /code>
Также предоставляет общий заказ для предотвращения тупика. Кодовый вектор-глобальный order.c
Код: Выделить всё
void vector_add(vector_t *v_dst, vector_t *v_src) {
if (v_dst < v_src) {
Pthread_mutex_lock(&v_dst->lock);
Pthread_mutex_lock(&v_src->lock);
} else if (v_dst > v_src) {
Pthread_mutex_lock(&v_src->lock);
Pthread_mutex_lock(&v_dst->lock);
} else {
// special case: src and dst are the same
Pthread_mutex_lock(&v_src->lock);
}
int i;
for (i = 0; i < VECTOR_SIZE; i++) {
v_dst->values[i] = v_dst->values[i] + v_src->values[i];
}
Pthread_mutex_unlock(&v_src->lock);
if (v_dst != v_src)
Pthread_mutex_unlock(&v_dst->lock);
}
Код: Выделить всё
./vector-avoid-hold-and-wait -t -n 16 -l 100000 -d
Time: 0.29 seconds
./vector-avoid-hold-and-wait -t -n 32 -l 100000 -d
Time: 0.36 seconds
./vector-avoid-hold-and-wait -t -n 64 -l 100000 -d
Time: 0.74 seconds
./vector-avoid-hold-and-wait -t -n 99 -l 100000 -d
Time: 1.11 seconds
./vector-global-order -t -n 16 -l 100000 -d
Time: 0.25 seconds
./vector-global-order -t -n 32 -l 100000 -d
Time: 0.54 seconds
./vector-global-order -t -n 64 -l 100000 -d
Time: 1.35 seconds
./vector-global-order -t -n 99 -l 100000 -d
Time: 1.95 seconds
< /code>
Но я не знаю почему. По моему мнению, избегая удержания и ожидания
Подробнее здесь: https://stackoverflow.com/questions/794 ... his-concur