스레드를 사용한 작업 Qt5, 어떻게 단일 스레드의 CPU affinity을 설정할 수 있습니까?Qt5에서 스레드의 CPU 선호도를 어떻게 설정할 수 있습니까?
스레드가 실행될 수있는 사용 가능한 CPU 코어의 마스크를 지정하려고합니다.
즉, Qt5는 Posix 스레드의 pthread_setaffinity_np()
과 동일합니까?
QThreadPool
에 의해 관리되는 스레드에 대해이 작업을 수행 할 수 있습니까?
스레드를 사용한 작업 Qt5, 어떻게 단일 스레드의 CPU affinity을 설정할 수 있습니까?Qt5에서 스레드의 CPU 선호도를 어떻게 설정할 수 있습니까?
스레드가 실행될 수있는 사용 가능한 CPU 코어의 마스크를 지정하려고합니다.
즉, Qt5는 Posix 스레드의 pthread_setaffinity_np()
과 동일합니까?
QThreadPool
에 의해 관리되는 스레드에 대해이 작업을 수행 할 수 있습니까?
일반적으로 이러한 종류의 작업은 기본 스레드 핸들을 추출한 다음 필요한 시스템 특정 작업을 수행함으로써 수행됩니다. 낮은 수준의 스레드 관리를 위해 허용되는 교차 플랫폼 API가 없기 때문입니다.
Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
{
// requires a C cast here otherwise we run into trouble on AIX
return to_HANDLE(pthread_self());
}
그리고 qthread_win.cpp
에서 구현이 예상되는 방법으로 다릅니다 : 우리는 qthread_unix.cpp
의 소스를 검사하는 경우
사실, 우리는 다음을 참조합니다 그래서
Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
{
return reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId()));
}
, 그것은이다 실행될 것으로 예상되는 각 플랫폼에 적절한 저수준 액션을 수행하는 애플리케이션 코드의 책임.
Qt는 프로세서 선호도를 설정하기위한 공개 API를 제공하지 않습니다. 풀 내의 QThread
에 액세스하기위한 API를 제공하지 않는 QThreadPool
에 대해서는이 작업을 수행 할 방법이 없습니다.
명시 적으로 생성 된 QThread
개체의 경우 QThread::getCurrentThreadId()
함수를 사용하여 스레드에 원시 "핸들"을 반환 한 다음이를 시스템의 스레드 관리 라이브러리 호출에 전달할 수 있습니다. 그러나 나는 이것을 강력하게 추천 할 것이다. 워드 프로세서 명시 적으로 상태 :
경고 :이 함수에 의해 반환 핸들 내부 목적으로 사용하고 응용 프로그램 코드에서 사용할 수 없습니다. 특정 플랫폼에 구축하는 경우
, 당신은 당신의 OS의 라이브러리 (예를 들어, pthreads
)에 호출을 혼합 할 수 있습니다,하지만 휴대용하지 않습니다 그것이 작동하는지 나는 모른다.
아마도 가장 좋은 방법은 전체 응용 프로그램의 CPU 선호도를 명령 줄에서 관리하는 것입니다. Linux를 사용하는 경우 taskset
을 사용하십시오. Windows의 경우 this SO answer을 살펴보십시오. 불행하게도, 애플은 사용자가 최소한 스레드와의 친 화성을 설정하지 못하도록 막연하게 결정했다.
저는 Mac OS/X에 관해서는 전혀 몰라요.하지만 저는 BSD ([그래서 : Mac OS X와 BSD가 얼마나 밀접하게 관련되어 있습니까?] (https://stackoverflow.com/q/3446231/)를 기반으로합니다. 7478597) 참조). 호기심에서 내가봤을 때 이것을 발견했습니다 : [SU : OS X에서 프로세서 친 화성을 설정하는 방법] (https://superuser.com/a/770772). – Scheff
@Scheff 예, 스레드 선호도 API를 알고 있습니다. 그러나 Mach 스레딩 코드의 대부분은 실제로 문서화되지 않았습니다. 나는 시스템 헤더에서 대부분 그것을 파헤쳐 야했다. 그 중 하나를 사용하는 방법을 알아 내려고했다. 그것은 성가신 것이다. – bnaecker