Используйте команды из argv для инициализации глобального мьютекса
Я хочу определить глобальный мьютекс, используя данные из argv. Не проблема, за исключением того, что я также хочу, чтобы этот мьютекс был глобальным.
Это не глобально::
int main (int argc, char **argv)
{
int arg_1 = atoi(argv[1]);
pthread_mutex_t mutex[arg_1];
return 0;
}
И это невозможно:
pthread_mutex_t mutex[arg_1];
int main (int argc, char **argv) {
int arg_1 = atoi(argv[1]);`
return 0;
}
Итак, что я должен сделать, чтобы иметь мьютекс, доступный во всех моих функциях, который определяется пользовательским вводом?
1 ответ
Решение
Вы можете использовать динамическое размещение, как и для любого другого типа. Единственная разница здесь в том, что динамически распределяемые мьютексы должны быть инициализированы с pthread_mutex_init()
:
pthread_mutex_t *mutex;
size_t n_mutex;
int main (int argc, char **argv)
{
size_t i;
if (argc < 2)
return 1;
n_mutex = atoi(argv[1]);
if (n_mutex == 0)
return 2;
mutex = calloc(n_mutex, sizeof mutex[0]);
if (!mutex)
return 3;
for (i = 0; i < n_mutex; i++) {
if (pthread_mutex_init(&mutex[i], NULL))
return 4;
}
/* global array mutex[] is initialised and can be used */
return 0;
}