各位大虾:
我想请教一下,如何手动将程序中多线程的不同线程分配到不同的核上。
因为,我看到在运行的时候,一个核运行率高,而一个核几乎没有运行。
我程序有丢失数据的情况(和硬件相关,软件可能反应不过来)。
我听说可以手动将线程分配到不同的cpu核上,但是MFC和windows SDK的不同。
但是那个函数不太清楚。
请教大家了
谢谢。

解决方案 »

  1.   

    问题应该不在这里吧,系统会自己调节的。楼主的情况好像是一个线程占CPU很高,一个线程占CPU低,怎么分也没用啊。除非两个线程能分担差不多等量的任务。
      

  2.   

    我在机器上发现一个问题
    我的程序是自动只在一个cpu上运行,而没有在双cpu上运行。
    需要手动设置,才能将程序在双cpu上运行。
    而且,程序关掉,再启动,又是一个cpu上运行。
    请问,如何设置程序能多cpu运行阿
    以后要是4核,又如何设置程序呢
    谢谢啦
      

  3.   

    参考一下我的这篇文章
    http://blog.csdn.net/gaoxiaowei/archive/2010/07/15/5736711.aspx
      

  4.   

    其实 CPU 之间的调度 是有一套算法的 用户不要关心这个 。 只要单个cpu负载(多核情况下)控制器会自己调整负载 是一个cpu工作 还是多个。
      

  5.   


    我看了
    //Thread 0 can only run on CPU 0.SetThreadAffinityMask(hThread0, 0x00000001); //第0位是1//Threads 1, 2, 3 run on CPUs 1, 2, 3.//第1 2 3位是1SetThreadAffinityMask(hThread1, 0x0000000E);SetThreadAffinityMask(hThread2, 0x0000000E);SetThreadAffinityMask(hThread3, 0x0000000E);你这里是不是写错了?是不是应该是:
    SetThreadAffinityMask(hThread1, 0x00000002);SetThreadAffinityMask(hThread2, 0x00000003);SetThreadAffinityMask(hThread3, 0x00000004);
      

  6.   

    不明白
    我在机器上试了试
    如果我想线程2在cpu2运行。
    我写
    SetThreadAffinityMask(hThread1, 0x00000002);
    好像不行啊你说位操作?是如何运行呢?
    能说的详细些马
    DWORD_PTR dwThreadAffinityMask的作用到底是什么啊?
    什么叫做
    dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集?
    谢谢
      

  7.   

    细细的看一下MSDN0x0001 1 
    0x0002 2 
    0x0003 1 or 2 
    0x0004 3 
    0x0005 1 or 3 
    0x0007 1, 2, or 3 
    0x000F 1, 2, 3, or 4 
     
    0x0001 00000000 00000001 1
    0x0003 00000000 00000011 1 and 2 
    0x0007 00000000 00000111 1, 2 and 3 
    0x0009 00000000 00001001 1 and 4
    0x007F 00000000 01111111 1, 2, 3, 4, 5, 6 and 7
      

  8.   

    那这个函数的返回值是什么作用呢?
    非零表示成功
    我写
    SetThreadAffinityMask(hThread1, 0x00000002);
    SetThreadAffinityMask(hThread2, 0x00000002);
    但是我两个线程返回的都是3
    如果写:
    SetThreadAffinityMask(hThread1, 0x0000000E);
    返回0,表明没有成功。返回3表示什么意思啊?
      

  9.   

    为什么写SetThreadAffinityMask(hThread1, 0x0000000E);
    返回没有成功阿?
      

  10.   

    If the function succeeds, the return value is the thread's previous affinity mask.
      

  11.   

    1. mask的每个位都对应一个cpu,所以最低位代表cpu0,次低位代表cpu1,对于双核,自然是需要只关心最低两位
    2. 这个mask只能是GetProcessAffinityMask 返回值的一个子集,不能任意设置
    3. 这个方法只能降低你线程被执行的机会,因此绝大多数情况下都不要用
      

  12.   

    我现在设置了,返回3
    但是我发现2个线程并没有在cpu2上运行阿?
    问题出在什么地方?
    有什么完整点的代码吗?
    谢谢啦
      

  13.   

    CStdString szMask = (PCSTR)(_bstr_t)srs.GetItemValue(0, "Value1");
    if (Regex::Int.IsMatchAll(szMask))
    {
    SYSTEM_INFO si;
    GetSystemInfo(&si); short nValue = 0x0001;
    for (int i=0; i<(si.dwNumberOfProcessors-1); ++i)
    {
    nValue = nValue << 1;
    nValue |= 0x0001;
    } if (atoi(szMask) < nValue)
    {
    HANDLE hThread = GetCurrentThread();
    SetThreadAffinityMask(hThread, atoi(szMask));
    }
      

  14.   

    我定义一个线程函数,用CreateThread创建该线程,当线程函数结束时需要释放资源吗?
    假如我不释放,当线程函数自动运行结束时用CreateThread创建相同的线程会出现什么情况。
      

  15.   

    你需要多核编程(OpenMP).
    http://forum.csdn.net/Intel/IntelMulti-core/
      

  16.   

    设置的时候是要在线程外面设置CREATE_SUSPENDED,然后用这个函数SetThreadAffinityMask还是
    在这个线程内,调用SetThreadAffinityMask呢?
    我试了好像都不行
    我是用AfxBeginThread生成线程的。
    我在外部CWinThread* pThread = AfxBeginThread()得到的pThread->m_hThread
    也可以在内部用GetCurrentThread()得到HANDLE.
    2个都试了。
    就是第二个核启动不起来哦

      

  17.   

    有个问题
    内部和外部得到的HANDLE的地址不同?
    为什么阿?
    内部:SetThreadAffinityMask(GetCurrentThread, 0x2);返回的是0,没有成功阿
    外部:SetThreadAffinityMask(pThread1->m_hThread, 0x2);返回的是3,但是资源管理器中看到的程序还是只是启动了1个核?
    哎。
    我要疯了哦
    嘿嘿
      

  18.   

    void CTestDragFileDlg::OnButton2() 
    {
            CString szMask = "1";
           //CString szMask = "2";

    SYSTEM_INFO si;
    GetSystemInfo(&si);

    short nValue = 0x0001;
    for (int i=0; i<(si.dwNumberOfProcessors-1); ++i)
    {
    nValue = nValue << 1;
    nValue |= 0x0001;
    }      //nValue=3;
    DWORD dd=0;
    if (atoi(szMask) < nValue)
    {
    HANDLE hThread = GetCurrentThread();
                    //dd返回3也是正确的
    dd=SetThreadAffinityMask(hThread, atoi(szMask));
    }
         
    }
    俺去吃饭了,自己好好研究一下。
      

  19.   

    你设置CString szMask = "1";
    dd=SetThreadAffinityMask(hThread, atoi(szMask));
    这个肯定是对的
    因为atoi(szMask)是1。
    我这里也是可以的,说明是核1。
    但是2,3,4,5,6,7,都试过,都不可以哦而且返回3,是什么意思?
    英文的翻译过来还是有些不懂哦
    If the function succeeds, the return value is the thread's previous affinity mask.
      

  20.   

    GetProcessAffinityMask 返回的值,就是你的Mask集,不能任意设置
    这边的3就是这个这个范围所以dwThreadAffinityMask只能设置在3这个范围内你的机器应该是双核吧?3,4,5,6,7,这个何从谈起
    2是可以的
      

  21.   

    void RtmInfo::SetMask(short nMask)
    {
    SYSTEM_INFO si;
    GetSystemInfo(&si); short nValue = 0x0001;
    for (int i=0; i<(si.dwNumberOfProcessors-1); ++i)
    {
    nValue = nValue << 1;
    nValue |= 0x0001;
    } if (nMask <= nValue)
    m_nAffinityMask = nMask;
    }
    BOOL RtmInfo::Attach ()
    {
    if (IsThread())
    {
    m_dwID = GetCurrentThreadId();
    HANDLE hThread, hThreadDup;
    hThread = GetCurrentThread();
    BOOL bSuccess = DuplicateHandle(GetCurrentProcess(), hThread, 
    GetCurrentProcess(), &hThreadDup,
    0, FALSE, 
    DUPLICATE_SAME_ACCESS);
    CloseHandle(hThread);

    if (!bSuccess)
    return FALSE; m_handle = hThreadDup;
    }
    else
    {
    m_dwID = GetCurrentProcessId();
    m_handle = NULL;
    } HANDLE hThread = GetCurrentThread();
    SetThreadAffinityMask(hThread, m_nAffinityMask); return TRUE;
    }把我的核心代码都给你贴出来了 ,打住了(O(∩_∩)O~)。自己理解去吧,此贴该结了