如何在Qt5中设置线程的CPU亲和力?

时间:2017-12-06 02:38:29

标签: c++ multithreading qt qt5 affinity

使用 Qt5 中的主题,如何设置单个主题的CPU affinity

我想指定线程可以在其下运行的可用CPU核心的掩码。

换句话说,Qt5相当于Posix线程的pthread_setaffinity_np()是什么?

我可以为QThreadPool管理的线程执行此操作吗?

2 个答案:

答案 0 :(得分:1)

Qt没有提供任何用于设置处理器关联的公共API。绝对没有办法为$contactPhotos.each(function () { var $photoInput = $(this).find("input[type=file]"); var img = $("<img />"); var photoPreview = $photoInput.parent().parent().parent().parent().find(".preview").attr("id"); var photoPreviewImg = $("#" + photoPreview); function readURL(input) { if (input.files && input.files[0]) { photoPreviewImg.html(""); //alert(JSON.stringify(photoPreviewImg, null, 4)); var reader = new FileReader(); reader.onload = function (e) { img.attr("style", "height:41px;"); img.attr("style", "width:210px;"); img.attr("src", e.target.result); } reader.readAsDataURL(input.files[0]); } } $(this).on('click','.input-button-modal', function(e) { var contactModal = $(this).parent().parent().parent().parent().parent().find(".modal").attr('id'); var currentModal = $('#' + contactModal); currentModal.attr("style", "display:none"); photoPreviewImg.append(img); }); $photoInput.parsley().on('field:success', function() { var inputID = $photoInput.attr('id'); var inputTarget = '#' + inputID; var inputValue = document.getElementById(inputID); //inputLabel.attr("style", 'width:70%;'); readURL(inputValue); $(inputTarget).parent().parent().parent().parent().find('.koh-photo-remove').show(); $contactForm.find('#terms').prop('required',true); }); }); 执行此操作, <RelativeLayout> <FrameLayout .... alpha =0.5/> <FrameLayout .... gravity=center alpha =0.9/>// decide your transperany </RelativeLayout> 甚至无法提供访问池中QThreadPool的API。

对于显式创建的QThread个对象,您可以尝试使用QThread函数返回本地&#34;句柄&#34;到线程,然后将其传递给系统的线程管理库调用。但我强烈建议不要这样做。文档明确指出:

  

警告:此函数返回的句柄用于内部目的,不应在任何应用程序代码中使用。

如果您正在为特定平台构建,您可能可以将调用混合到您的操作系统库(例如QThread::getCurrentThreadId()),但这不会是可移植的,我没有想法是否有效。

最好的办法是从命令行管理整个应用程序的CPU亲和力。如果您使用Linux,taskset是可行的方法。对于Windows,请查看this SO answer。不幸的是,Apple似乎非常决心阻止用户设置线程关联,至少从命令行开始。

答案 1 :(得分:1)

通常通过提取本机线程句柄然后执行任何必要的系统特定事务来完成这类事情,因为没有可接受的跨平台API用于低级线程管理。

的确,如果我们检查qthread_unix.cpp的来源,我们会看到以下内容:

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中,实施方式会有所不同:

Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
{
    return reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId()));
}

因此,应用程序代码负责执行与预期运行的每个平台相关的适当低级操作。