Как установить атрибуты потоков в Linux? - PullRequest
1 голос
/ 10 марта 2012

Теперь я хочу создать три процесса в моей программе, и в каждом процессе есть несколько потоков.
И каждый поток - это бесконечная задача, которая может периодически останавливаться и периодически запускаться.Кроме того, у процесса есть какая-то задача.
Мои вопросы:

1) Нужно ли устанавливать потоки как отдельные?Если я установлю потоки как отделенные, они, кажется, не запускаются !!Но, если потоки как присоединяемые, процесс должен ждать завершения потоков и не может выполнять свою работу !!какой из них выбрать?

2) Какова область действия политики расписаний?Я имею в виду, если я устанавливаю политику расписания как FIFO, все потоки во всех процессах планируются политикой FIFO?Или только поток, который установлен с этим атрибутом, запланирован этой политикой?

3) Какова область приоритета потока?Приоритеты потоков просто полезны в одном процессе, а в другом процессе существует другой набор приоритетов потоков.И они не заражают друг друга ???

Буду признателен за вашу помощь!спасибо!

Ответы [ 3 ]

1 голос
/ 10 марта 2012

ОТКЛЮЧЕНО ИЛИ СОЕДИНЕНО: Это зависит от типа требуемого требования.

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

Есливам нужен основной исполняемый поток, чтобы ждать только возвращаемого значения и не нужно выполнять какие-либо другие задачи самостоятельно.Вы можете использовать JOIN.

Когда создается поток, он использует политику планирования по умолчанию, если только он не изменен атрибутом, перед вызовом pthread_create.Также, после создания, вы можете динамически изменять политику планирования.ПРИМЕЧАНИЕ. Политика планирования влияет на потоки с одинаковым приоритетом.

Приоритет: вы можете изменить приоритет с помощью pthread_setschedparam (также для политики планирования).Тем не менее, в Linux поток также легкий процесс.Таким образом, все потоки с приоритетом рассматриваются на уровне всего процесса, а не внутри каждого процесса.

0 голосов
/ 10 марта 2012

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

Невозможно сказать, должны ли ваши потоки присоединяться или отсоединяться, не зная, что вы делаете.Основным преимуществом присоединяемых потоков является то, что вы знаете, когда они заканчиваются, и вы можете проверить возвращаемые данные.Если они не важны для вас, нет никакого реального преимущества сделать их присоединяемыми - кроме как их немного легче создать, потому что это по умолчанию.

Если вы не хотите блокировать там pthread_joinстратегии вы можете следовать.Ваши потоки могут устанавливать переключатели до того, как они умрут, вы можете использовать условные переменные, у вас может быть отдельный поток, который присоединяет мертвые потоки и так далее.Опять же, невозможно узнать, какая стратегия лучше всего подходит для вашего конкретного случая.

(2 & 3) Поток наследует политику расписания и приоритет потока, который его создает, и они остаются такими, если только вы специальноизменить их.Политика / приоритет потоков в одном процессе напрямую не связаны с каким-либо другим процессом.

0 голосов
/ 10 марта 2012

Я отвечаю только на первый вопрос:

Нет необходимости создавать потоки как отдельные, так как вы можете просто присоединиться к ним в конце основного процесса.

Чтобы создать потоки как отдельные, вы должны сначала создать атрибут, а затем использовать его в качестве параметра для pthread_create

pthread_t thread1;
pthread_attr_t attr;

int chk;

chk = pthread_attr_init(&attr);
printf("attr_init: %d\n",chk);

chk = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
printf("attr_setdetachstate: %d\n",chk);

chk = pthread_create(&thread1, &attr, function, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...