Правильно ли использование в function1 или function2?
Оба значения одинаково верны и будут работать. Первый вариант «лучше» для этого конкретного случая.
Первый, который принимает мьютекс на время l oop, больше эффективен , потому что накладных расходов меньше (блокировки и разблокировки мьютекса). Он лучше всего подходит для таких вещей, как копирование данных.
Второй, который принимает мьютекс на время доступа к каждому элементу, лучше подходит, когда модификация более сложная и может занять некоторое время (условно говоря) , и вам нужен только один элемент . Однако тогда вы должны использовать мьютекс только для самой модификации, а не для всего вычисления (или, скажем, считывания датчика):
for (i = 0; i < sensor_count; i++) {
value = read_sensor(i);
pthread_mutex_lock(&mutex);
sensor_reading[i] = value;
pthread_mutex_unlock(&mutex);
}
вместо pthread_mutex_lock(&mutex); sensor_reading[i] = read_sensor(i); pthread_mutex_unlock(&mutex);
, потому что последний будет просто удерживать мьютекс во время чтения датчика, блокируя доступ других потоков к массиву на время вызова read_sensor(i)
без разумной причины.
Простое присвоение или арифметика c для элемента массива не 'медленное ', и поэтому здесь рекомендуется использовать первую функцию.
В общем, шаблон
for (i = 0; i < N; i++) {
pthread_mutex_lock(&mutex);
/* Do something */
pthread_mutex_unlock(&mutex);
}
освобождает мьютекс только на короткое время, и в зависимости от реализации pthreads он может быть недостаточно длинным для любого другого потока, чтобы захватить мьютекс, даже если они уже блокировали / ожидали мьютекса (в вызове pthread_mutex_lock (& mutex)). Это не является неправильным или ошибочным, но он просто работает так же, как
pthread_mutex_lock(&mutex);
for (i = 0; i < N; i++) {
/* Do something */
}
pthread_mutex_unlock(&mutex);
, и менее эффективен, чем эта последняя форма, потому что первая делает (N
-1) дополнительный pthread_mutex_lock () и pthread_mutex_unlock (), без каких-либо гарантий каких-либо преимуществ от этого.