Отключить сродство ядра для всех потоков по умолчанию

Я использую ffmpeg в моем приложении, которое порождает множество потоков. Однако мне бы хотелось, чтобы у моего приложения, имеющего семантику в реальном времени, было одно из ядер процессора. Поэтому в основном мне нужен способ отключить планирование потоков, порожденных ffmpeg, для ядра и установить привязку основного потока к этому ядру.

Это возможно?

например

main()
{
struct sched_param param;
param.sched_priority = 95;
sched_setscheduler(getpid(), SCHED_FIFO, &param);

int core_id = 0;

// TODO: Remove core_id from cpuset for all future thread default affinities.

pthread_t ffmpeg_thread;
pthread_create(&ffmpeg_thread, NULL, run_ffmpeg, NULL);

pthread_t rt_thread;
pthread_create(&rt_thread, NULL, run_rt, NULL);

cpu_set_t rt_cpuset;
CPU_ZERO(&rt_cpuset);
CPU_SET(core_id, &rt_cpuset);
pthread_setaffinity_np(rt_thread, sizeof(rt_cpuset), &rt_cpuset);

pthread_join(ffmpeg_thread, NULL);
pthread_join(rt_threadm, NULL);
}

0

Решение

Потоки наследуют свою близость от вызывающего потока.

Увидеть pthread_create

Детали, специфичные для Linux
Новый поток наследует копии возможностей вызывающего потока
наборы (см. возможности (7)) и маску привязки к процессору (см.
sched_setaffinity (2)).

Так что, просто установив сродство для обоих потоков, как вы захотите, все дополнительные порожденные потоки наследуют их сродство. Который сделал бы именно то, что я хочу.

0

Другие решения

Других решений пока нет …