21xrx.com
2024-09-19 09:37:54 Thursday
登录
文章检索 我的文章 写文章
Windows平台下使用C++实现多线程并设置亲和性
2023-07-04 20:37:23 深夜i     --     --
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 平台下非常实用。开发人员可以通过掌握多线程和亲和性相关知识,来优化程序性能,提升用户体验,为用户带来更好的使用体验。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章