21xrx.com
2025-03-28 05:40:39 Friday
文章检索 我的文章 写文章
Windows平台下使用C++实现多线程并设置亲和性
2023-07-04 20:37:23 深夜i     45     0
Windows平台 C++ 多线程 亲和性设置 并发编程

在操作系统中,多线程可以使程序效率大幅提升。在 Windows 平台下,通过使用 C++ 实现多线程,并设置亲和性,可以使程序更加高效。下面将详细介绍这一过程。

首先,我们需要了解什么是多线程。多线程是指在一个进程中开辟多个线程,每个线程可以独立执行不同的程序片段,从而达到并行处理的目的。在 Windows 平台下,可以使用 C++ 实现多线程。C++ 内置了一些函数用于实现多线程,例如 _beginthreadex() 和 CreateThread()。

接下来,我们需要了解什么是亲和性。亲和性指的是线程与 CPU 核之间的关系。在多核 CPU 中,需要把线程分配给不同的 CPU 核来使程序更快。设置亲和性可以提高程序的效率,减少不必要的资源浪费。在 Windows 平台下,可以使用 SetThreadAffinityMask() 函数来设置亲和性。

下面是一个简单的示例代码,用于演示使用 C++ 实现多线程并设置亲和性:

#include <iostream>
#include <windows.h>
#include <process.h>
void printThreadId(int threadId)
{
  DWORD_PTR processAffinityMask;
  DWORD_PTR systemAffinityMask;
  DWORD_PTR threadAffinityMask = (DWORD_PTR)1 << threadId;
  HANDLE currentThread = GetCurrentThread();
  
  // 获取 CPU 核数
  GetProcessAffinityMask(GetCurrentProcess(), &processAffinityMask, &systemAffinityMask);
  int numOfCores = 0;
  while (systemAffinityMask)
  {
    if (systemAffinityMask & 1)
      numOfCores++;
    systemAffinityMask = systemAffinityMask >> 1;
  }
  
  // 设置线程亲和性
  SetThreadAffinityMask(currentThread, threadAffinityMask);
  
  // 获取当前线程所在的 CPU 核数
  DWORD_PTR newProcessAffinityMask;
  DWORD_PTR newSystemAffinityMask;
  GetProcessAffinityMask(GetCurrentProcess(), &newProcessAffinityMask, &newSystemAffinityMask);
  int numOfThreadCore = 0;
  while (newProcessAffinityMask)
  {
    if (newProcessAffinityMask & 1)
      numOfThreadCore++;
    newProcessAffinityMask = newProcessAffinityMask >> 1;
  }
  
  std::cout << "Thread " << threadId << " runs on core " << numOfThreadCore-1 << " out of " << numOfCores << " cores." << std::endl;
}
int main()
{
  // 启动两个线程
  HANDLE thread1 = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(*)(void*))printThreadId, (void*)0, 0, NULL);
  HANDLE thread2 = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(*)(void*))printThreadId, (void*)1, 0, NULL);
  
  WaitForSingleObject(thread1, INFINITE);
  WaitForSingleObject(thread2, INFINITE);
  CloseHandle(thread1);
  CloseHandle(thread2);
  return 0;
}

上述代码创建了两个线程,并分别将它们分配到 CPU 核 0 和核 1 执行。通过设置亲和性可以提高程序的效率,利用多核 CPU 的优势,更有效地完成计算任务。

综上所述,使用 C++ 实现多线程并设置亲和性可以大幅提升程序的效率,在 Windows 平台下非常实用。开发人员可以通过掌握多线程和亲和性相关知识,来优化程序性能,提升用户体验,为用户带来更好的使用体验。

  
  

评论区

    相似文章
请求出错了