我正在尝试使用从我的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 功能
提前致谢!
答案 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();
}
});