Используйте команды из 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;
}
Другие вопросы по тегам