各位大虾:
我想请教一下,如何手动将程序中多线程的不同线程分配到不同的核上。
因为,我看到在运行的时候,一个核运行率高,而一个核几乎没有运行。
我程序有丢失数据的情况(和硬件相关,软件可能反应不过来)。
我听说可以手动将线程分配到不同的cpu核上,但是MFC和windows SDK的不同。
但是那个函数不太清楚。
请教大家了
谢谢。
我想请教一下,如何手动将程序中多线程的不同线程分配到不同的核上。
因为,我看到在运行的时候,一个核运行率高,而一个核几乎没有运行。
我程序有丢失数据的情况(和硬件相关,软件可能反应不过来)。
我听说可以手动将线程分配到不同的cpu核上,但是MFC和windows SDK的不同。
但是那个函数不太清楚。
请教大家了
谢谢。
我的程序是自动只在一个cpu上运行,而没有在双cpu上运行。
需要手动设置,才能将程序在双cpu上运行。
而且,程序关掉,再启动,又是一个cpu上运行。
请问,如何设置程序能多cpu运行阿
以后要是4核,又如何设置程序呢
谢谢啦
http://blog.csdn.net/gaoxiaowei/archive/2010/07/15/5736711.aspx
我看了
//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);
我在机器上试了试
如果我想线程2在cpu2运行。
我写
SetThreadAffinityMask(hThread1, 0x00000002);
好像不行啊你说位操作?是如何运行呢?
能说的详细些马
DWORD_PTR dwThreadAffinityMask的作用到底是什么啊?
什么叫做
dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集?
谢谢
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
非零表示成功
我写
SetThreadAffinityMask(hThread1, 0x00000002);
SetThreadAffinityMask(hThread2, 0x00000002);
但是我两个线程返回的都是3
如果写:
SetThreadAffinityMask(hThread1, 0x0000000E);
返回0,表明没有成功。返回3表示什么意思啊?
返回没有成功阿?
2. 这个mask只能是GetProcessAffinityMask 返回值的一个子集,不能任意设置
3. 这个方法只能降低你线程被执行的机会,因此绝大多数情况下都不要用
但是我发现2个线程并没有在cpu2上运行阿?
问题出在什么地方?
有什么完整点的代码吗?
谢谢啦
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));
}
假如我不释放,当线程函数自动运行结束时用CreateThread创建相同的线程会出现什么情况。
http://forum.csdn.net/Intel/IntelMulti-core/
在这个线程内,调用SetThreadAffinityMask呢?
我试了好像都不行
我是用AfxBeginThread生成线程的。
我在外部CWinThread* pThread = AfxBeginThread()得到的pThread->m_hThread
也可以在内部用GetCurrentThread()得到HANDLE.
2个都试了。
就是第二个核启动不起来哦
哎
内部和外部得到的HANDLE的地址不同?
为什么阿?
内部:SetThreadAffinityMask(GetCurrentThread, 0x2);返回的是0,没有成功阿
外部:SetThreadAffinityMask(pThread1->m_hThread, 0x2);返回的是3,但是资源管理器中看到的程序还是只是启动了1个核?
哎。
我要疯了哦
嘿嘿
{
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));
}
}
俺去吃饭了,自己好好研究一下。
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.
这边的3就是这个这个范围所以dwThreadAffinityMask只能设置在3这个范围内你的机器应该是双核吧?3,4,5,6,7,这个何从谈起
2是可以的
{
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~)。自己理解去吧,此贴该结了