область действия аргументов функции pthread - PullRequest
0 голосов
/ 03 января 2019

Вот подпись pthread_setschedparam:

#include <pthread.h>

int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param);

Не приведет ли этот фрагмент кода к неожиданному поведению:

void schedule(const thread &t, int policy, int priority) {
    sched_param params;
    params.sched_priority = priority;
    pthread_setschedparam(t.native_handle(), policy, &params);
}

Совершенно неясно, нужно ли расширять область действия params.чем вызов функции в одиночку.Когда я вижу функцию, которая принимает указатель, он предлагает (по крайней мере мне) запросить право владения ею.Эта подпись просто плохо оформлена?Должны ли "sched_params params" жить в куче?Нужно ли пережить поток, чтобы оставаться в силе?Можно ли его удалить?

Понятия не имею.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Когда я вижу функцию, которая принимает указатель, он предлагает (по крайней мере мне) запросить владение ею.

Я не прыгаю прямо там, когдаЯ вижу функцию, которая принимает параметр указателя, и я не думаю, что вы тоже должны.Хотя важно знать о возможности, и вы хорошо ищите документацию, существует множество причин, по которым функция принимает параметр указателя, среди которых:

  • , которую принимает функциямассивы через параметр.Это, безусловно, самая распространенная причина.
  • функция хочет изменить объект, указанный ей вызывающей стороной (через указатель).Вероятно, это вторая наиболее распространенная причина.
  • функция принимает указатель на структуру или объединение большого или потенциально большого размера, чтобы облегчить издержки вызова функции
  • функциипринимает указатель на структуру или объединение, потому что он соответствует соглашениям об интерфейсе, которые поддерживают древние компиляторы Си, которые не принимали структуры и объединения в качестве аргументов.Это было нормально для ранних компиляторов Си, так как изначально был задан язык:

    [T] он только операции, которые вы можете выполнять над структурой, берет его адрес с & и получает доступ к одномуего членов.[... Структуры] не могут быть переданы или возвращены из функций.[...] Указатели на структуры не страдают этими ограничениями [.]

    (Kernighan & Ritchie, Язык программирования C , 1 st ed., раздел 6.2)

    Стандарт C не имеет этих ограничений, но их влияние все еще ощущается в некоторых местах.

, которые ожидает функция (икак правило, переназначать) ответственность за освобождение динамически распределенного пространства, на которое указывает указатель, или за то, что он иным образом намеревается сделать копию указателя, который сохраняется после возврата функции, находятся далеко внизу списка.Если функция намеревается выполнить одно из этих действий, то я полностью ожидаю, что в ее документации будет указано каким-либо образом.

Эта подпись просто плохо оформлена?

НетЯ думаю, что его дизайн подсказывается одним или обоими последними двумя пунктами из моего списка.

Должны ли "sched_params params" жить в куче?

Я быне ожидайте, что это будет требованием.

Нужно ли пережить поток, чтобы оставаться действительным?Можно ли его удалить?

Я не думаю, что нужно пережить поток, свойства которого установлены.В дополнение к моей общей интерпретации интерфейса, я прочитал (слабую) поддержку этой позиции в формулировке спецификации POSIX функции:

Функция pthread_setschedparam() должна устанавливать политику планирования и соответствующее планированиепараметры для потока, чей ID потока указан потоком для политики и связанных параметров , предоставленных в policy и param соответственно.

( спецификация POSIX для pthread_setscheduleparam(); выделение добавлено)

Язык «предоставлено на» указывает мне (опять же, слабо), что функция использует содержимое структуры, на которую указываютне сама структура.

0 голосов
/ 03 января 2019

pthread_setschedparam устанавливает политику планирования для данного потока. Параметры не обязательно должны быть активны после вызова.

Если бы срок действия последнего аргумента имел значение (как вы говорите, если pthread_setschedparam вступает во владение им), это было бы явно задокументировано. Но это не в документации POSIX pthread_setschedparam .

Вероятная причина, по которой он принимает указатель (вместо значения), заключается в том, что передавать указатель дешевле, чем struct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...