使用从C#代码中的kernel32.dll导入的SetThreadAffinityMask函数

时间:2010-03-23 08:46:13

标签: c# multithreading

我正在尝试使用从我的C#代码中的kernel32.dll导入的 SetThreadAffinityMask 函数来设置线程相关性。

这就是我在C#.net代码中从“kernel32.dll”导入 SetThreadAffinityMask 的功能

 [DllImport("kernel32.dll")]  
 static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

我正在创建3个帖子

    Thread t1=new Thread(some delegate);
    Thread t2=new Thread(some delegate);
    Thread t3=new Thread(some delegate);

我希望为t1,t2和amp设置线程亲和力。 t3我正在使用 SetThreadAffinityMask 功能。

但我没有得到如何将参数传递给这个函数。

SetThreadAffinityMask 需要两个参数

1. HANDLE hThread
2. DWORD_PTR dwThreadAffinityMask

请帮我在C#中使用 SetThreadAffinityMask 功能

提前致谢!

4 个答案:

答案 0 :(得分:3)

你不能使用Thread.BeginThreadAffinity吗?

答案 1 :(得分:2)

别。

托管线程<>本地线程。

托管线程支持的唯一选项是围绕需要线程关联的代码调用Thread.BeginThreadAffinity / EndThreadAffinity。

答案 2 :(得分:0)

我找到了一个使用此函数here的示例。

答案 3 :(得分:0)

首先,您应该确保您的.NET线程在特定的操作系统线程上运行。用Thread.BeginThreadAffinity();Thread.EndThreadAffinity();包裹逻辑来做到这一点。

使用GetCurrentThread()中的kernel32.dll获取当前线程句柄。

documentation中描述的线程关联掩码dwThreadAffinityMask

  

线程关联掩码是一个位向量,其中每个位表示允许线程运行的逻辑处理器。被允许继续运行。

e.g。如果要在第二个和第四个逻辑处理器上运行线程,请使用0x0A掩码。

代码示例:

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();

[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

Thread t1 
  = new Thread(() => 
  {
    try
    {
      Thread.BeginThreadAffinity();
      SetThreadAffinityMask(GetCurrentThread(), new IntPtr(0x0A));

      // <your thread logic here>          
    }
    finally
    {
      Thread.EndThreadAffinity();
    } 
  });