Я использую ffmpeg в моем приложении, которое порождает множество потоков. Однако мне бы хотелось, чтобы у моего приложения, имеющего семантику в реальном времени, было одно из ядер процессора. Поэтому в основном мне нужен способ отключить планирование потоков, порожденных ffmpeg, для ядра и установить привязку основного потока к этому ядру.
Это возможно?
например
main()
{
struct sched_param param;
param.sched_priority = 95;
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
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);
}
Потоки наследуют свою близость от вызывающего потока.
Увидеть pthread_create
Детали, специфичные для Linux
Новый поток наследует копии возможностей вызывающего потока
наборы (см. возможности (7)) и маску привязки к процессору (см.
sched_setaffinity (2)).
Так что, просто установив сродство для обоих потоков, как вы захотите, все дополнительные порожденные потоки наследуют их сродство. Который сделал бы именно то, что я хочу.
Других решений пока нет …