c++ - 如果线程函数包含 "printf()",SetThreadAffinityMask() 似乎不起作用

标签 c++ multithreading setthreadaffinitymask

我写了一个测试程序来绑定(bind)CPU上的线程。这是我的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
DWORD WINAPI ThreadFunc(LPVOID pM) {
    while(1) {
        printf("Doesn't work anymore");   //If i add this printf function,the setthreadaffinitymask seems doesn't work anymore.Which u can see from two pictures i post.
    }
}
int main() 
{
    HANDLE h;
    DWORD_PTR RetFlag;
    h = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
    if((RetFlag = SetThreadAffinityMask(h, 0x08)) == 0)
        printf("SetThreadAffinityMask fails\n");
    WaitForSingleObject(h, INFINITE);
    return 0;
}

CPU Rate Pic without printf()

CPU Rate Pic with printf()

当然,正确的结果应该像图一那样。但是,如果我在线程函数中添加 printf() 函数,会发生什么情况?有什么我不知道的技巧吗?谢谢...

最佳答案

我认为亲和性确实有效,但这里的问题是 printf() 写入了一些文本(到控制台?)并同步等待写入文本。

现在,这个文本必须打印在某处,而那个某处负责不同的线程/进程,它甚至可以是对磁盘或网络的真正 I/O。这就是您看到 CPU3 的 CPU 使用率下降的原因:它处于空闲状态,等待 I/O 完成。

关于c++ - 如果线程函数包含 "printf()",SetThreadAffinityMask() 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180528/

相关文章:

kernel-module - 在 linux 内核模块中设置线程亲和性

c++ - 在四叉树中存储十亿个多边形

c# - 从 C++ 到 C# 重写串口通信

javascript - 使用 emscripten embind 在 C++ 中调用 javascript 函数

java - 线程安全 - 传递给线程的最终局部方法变量?

multithreading - Julia Threads.@threads 比单线程性能慢

c++ - Pthread_setaffinity_np 参数无效

c++ 范围的排序 View - 如何创建 const_iterator?

java - 后台任务 fragment 和 "Can not perfom this action after onSaveInstanceState"