问题标签 [setthreadaffinitymask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2706 浏览

windows - SetThreadAffinityMask 被忽略....有什么想法吗?

更新:我发现了问题 - 令人尴尬/讽刺的是,它是在错误的线程中调用 SetThreadAffinity(),而不是主线程(程序启动很混乱......)

现在一切正常,感谢所有帮助!我已经为参加我的小型调试会议的每个人投了赞成票。

0 投票
6 回答
1620 浏览

c++ - 当前线程的线程关联掩码更改有什么好处?

我正在编写一个游戏引擎,我需要一种方法来获得一个精确和准确的“deltatime”值,从中得出当前的 FPS 进行调试并限制帧速率(这对我们的项目很重要)。

做了一些研究,我发现最好的方法之一是使用 WinAPI 的QueryPerformanceCounter函数。GetTicksCount必须用来防止向前反跳,但它本身不是很准确。

现在,问题QueryPerformanceCounter在于,它显然可能会返回看起来像时间扭曲的值(即,相对于过去的另一个调用,调用可能会在时间上返回一个更早的值)。仅当将使用给定处理器内核获得的值与使用另一个处理器内核获得的值进行比较时才会发生这种情况,这使我想到了促使我发表这篇文章的终极问题:

  1. 操作系统可以在线程已经运行时将线程“重新分配”到另一个内核,还是将线程分配给给定的内核,直到线程死亡?
  2. 如果无法重新分配线程(至少对我来说很有意义),那么为什么我可以做类似的事情SetThreadAffinityMask(GetCurrentThread(),mask)Ogre3D在其Ogre::Timer 类 (Windows implementation)中做到这一点,我假设这是为了避免时间倒退。但要做到这一点,我将不得不考虑操作系统任意将线程从一个内核移动到另一个内核的可能性,这对我来说似乎很奇怪(不知道为什么)。

我想这就是我现在想知道的。谢谢。

0 投票
5 回答
32780 浏览

java - Java 线程亲和性

有人知道将Java进程中的单个线程锁定到特定CPU内核(在Linux上)的方法吗?我已经在 C 中完成了此操作,但在 Java 中找不到如何执行此操作。我的直觉是,这将需要一个 JNI 调用,但我希望这里的某个人可能有一些见识,或者可能以前做过。

谢谢!

0 投票
1 回答
2287 浏览

linux - pthreads_setaffinity_np:参数无效?

我已经设法让我的 pthreads 程序正常工作。基本上我正在尝试手动设置 4 个线程的亲和性,以便线程 1 在 CPU 1 上运行,线程 2 在 CPU 2 上运行,线程 3 在 CPU 3 上运行,线程 4 在 CPU 4 上运行。

编译后,我的代码适用于几个线程,但不适用于其他线程(似乎线程 1 从不工作),但运行相同的编译程序几次不同的时间会给我不同的结果。

例如:
hao@Gorax:~/Desktop$ ./a.out
线程 3 正在 CPU 3 上运行
pthread_setaffinity_np: Invalid argument
线程 2 正在 CPU 2 上运行
hao@Gorax:~/Desktop$ ./a.out
线程 2正在 CPU 2 上运行
pthread_setaffinity_np: 参数无效
pthread_setaffinity_np: 参数无效
线程 3 正在 CPU 3 上运行
线程 3 正在 CPU 3 上运行
hao@Gorax:~/Desktop$ ./a.out
线程 2 正在 CPU 2 上运行
pthread_setaffinity_np: 无效参数
线程 4 正在 CPU 4 上运行
线程 4 正在 CPU 4 上运行
hao@Gorax:~/Desktop$ ./a.out
pthread_setaffinity_np: Invalid argument

我的问题是“为什么会发生这种情况?另外,为什么该消息有时会打印两次?”

这是代码:

0 投票
1 回答
618 浏览

c# - 为什么 PerformanceCounter 的 NextValue 调用会更改线程关联掩码

我有一个 C# 项目,我必须在其中访问我的处理器的当前工作负载,并确保我在处理器的每个内核上运行一些特定的代码。我的问题是,访问我的处理器的工作负载似乎阻止我正确分配线程关联掩码。我这里有一些代码,可以说明问题:

运行此代码会产生以下输出:

因此,似乎 cpuUsage.NextValue 调用以某种方式更改了线程关联掩码,并且也使得无法将掩码更改为 1。确实有道理,Nextvalue 调用必须以某种方式与线程关联掩码交互,如果它正在汇总每个内核的性能计数,但我无法理解,为什么它会影响未来对线程关联掩码的更改。有人对此问题有解释或解决方法吗?

0 投票
2 回答
481 浏览

c++ - SethreadAffinityMask() 正确用法?

我有 1500 个线程..我希望它们在 12 个处理器上运行...为此我称之为 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));其中处理器数 = 12。口罩的使用正确吗?它需要可扩展,也就是说,如果我希望它仅在 11 个处理器上运行,那么 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));numprocessors=11。

0 投票
1 回答
787 浏览

c++ - pthread_setaffinity_np 无效参数

我正在尝试更改启动例程中每个线程的亲和力。

这是代码。在下面的代码中,'t' 是通过 pthread_create 函数传递的参数。

线程关联性没有改变。我哪里错了?

0 投票
1 回答
2057 浏览

c++ - Windows SetThreadAffinityMask 无效

我编写了一个小型测试程序,在其中尝试使用 Windows API 调用 SetThreadAffinityMask 将线程锁定到单个 NUMA 节点。我使用 GetNumaNodeProcessorMask API 调用检索节点的 CPU 位掩码,然后将该位掩码与 GetCurrentThread 返回的线程句柄一起传递给 SetThreadAffinityMask。这是我的代码的一个大大简化的版本:

我当然会检查 API 调用是否在我的代码中返回 0,并且我还打印了 NUMA 节点掩码,这正是我所期望的。我还遵循了其他地方给出的建议,并打印了第二次相同调用 SetThreadAffinityMask 返回的掩码,它与节点掩码匹配。

但是,通过查看 DoWork 函数执行时的资源监视器,工作被分配到所有内核中,而不仅仅是表面上绑定的内核。使用 SetThreadAffinityMask 时我可能错过了哪些错误?我正在运行 Windows 7 Professional 64 位,DoWork 函数包含一个与 OpenMP 并行的循环,该循环对三个非常大的数组的元素执行操作(它们组合起来仍然能够适合节点)。

编辑:为了扩展 David Schwartz 给出的答案,在 Windows 上,任何使用 OpenMP 产生的线程都不会继承产生它们的线程的亲和性。问题在于,而不是 SetThreadAffinityMask。

0 投票
1 回答
892 浏览

mysql - 限制 MySQL 使用的核心数

在 Linux 上,你能确保 MySQL 留出一个内核吗?

(我们有一个小型 Python 服务器,当在同一个机器上运行的 MySQL 处于负载状态时,它可能会变得无响应。)

0 投票
1 回答
1420 浏览

c++ - Windows.h 线程亲和性

下面的代码会编译并运行,只是输出不是我所期望的。我希望程序创建 n 个线程(取决于可用的多核数量)并运行一个在程序末尾找到的简单例程用于输出

“测试:”

后跟数字 1-10。相反,我得到的是一个输出,它确实写了一些数字,但最多不超过两个,并且函数 threadmain 似乎没有完全在一个线程上运行,但它在某种程度上输出 testing: 012 在其他线程上。我知道多线程会破坏输出,但我应该在屏幕上的某处看到数字 3、4、5、6、7、8、9,但它没有出现。