为什么不能双线程并行执行? 写了个一累加计算的双线程代码,放在新建的工程中,通过测试可以多线程执行,但放在另一个工程中就不能多线程并行执行,CPU资源总是50%,从没到100%,这是怎么回事?是不是有线程限制的问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CPU占用50%表示线程没执行???这个理由太勉强了。首先判断两个线程是不是都创建成功了。再看看任务管理器(调试器也可以)中程序是不是增加了线程在运行。或者用其他更强大的系统信息查看工具看看程序的线程处于什么状态。运行,就绪,还是挂起。 CPU 50% 的那个是不是双核处理器? 双核处理器中,一个线程满负荷运行,那CPU占用率就正好是50%,如果有两个线程满负荷运行,那么就是100%。如果是单(核)CPU,要让它负载稳定在50%是非常困难的。 不知LS的有没有真的写代码在双核CPU的机器上测试过??我就试过,一个线程,死循环,双核都是100%。windows内部管理多CPU用的是对称多处理器的方法。会尽量让多个CPU(多个核)之间负载平衡。其实这样做效率并不高,但在繁忙是可以完全利用CPU资源。按楼上说的。一个线程满负荷运行CPU占用刚好是50%,两个线程是100%,那如果是双CPU*双核,三个线程全负荷运行,CPU占用应该是多少呢?而且对于线程满负荷运行这个说法,我还真是第一次看到。 我觉得负荷稳定50%确实是非常困难的,所以同意guogangj(无名小卒)的说法而且window的cpu调度机制应该没有达到线程内的负荷平衡吧?不过还有一种可能就是,一个程序使用哪个cpu是可以设置的,我知道任务管理器里面可以设置,估计用程序代码也应该可以设置吧?如果是这样的话,就有可能是有一个核没有利用起来 CPU利用率应该是和线程优先级有关,另外楼主的问题我想可能是链接时用了不同的C运行时库,一个是单线程的,一个是多线程。 windows只是尽量让多个CPU负荷平衡。尽量一个中国人常用的词。确实是可以设置进程的CPU亲缘关系。但默认程序是运行可以在所有CPU上。也就是被windows安排尽量让多个CPU(核)平衡。除非显式的调用过SetThreadAffinityMask或者SetProcessAffinityMask。或者父进程被设置了亲缘关系。双核CPU,如果设置了只允许某个线程在其中一个核上运行。那就算这个线程是个死循环,系统总的CPU占用率也只有50%再多一些。多这部分由系统中其他运行的程序决定。但是。默认是全部占用。 这是我的代码,我用的是双核电脑。 HANDLE m_hThread1=NULL; HANDLE m_hThread2=NULL; HANDLE hEvent1=NULL; HANDLE hEvent2=NULL; long a=1000000000; DWORD WINAPI Thread1(LPVOID lpParameter) { double b=0; for(int i=0; i<a/2; i++) { b = i + b; } SetEvent( hEvent1 ); return 1; } DWORD WINAPI Thread2(LPVOID lpParameter) { double c=0; for(int i=a/2; i<=a; i++) { c = i + c; } SetEvent( hEvent2 ); return 1; } int testthread() { LONG ITime,durITime; char buf[20]; double b=0; ITime=GetCurrentTime(); hEvent1 = CreateEvent( NULL, FALSE, FALSE, NULL ); hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL ); m_hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL); m_hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL); CloseHandle(m_hThread1); CloseHandle(m_hThread2); WaitForSingleObject( hEvent1, INFINITE ); WaitForSingleObject( hEvent2, INFINITE ); durITime=GetCurrentTime()-ITime; memset(buf,'\0',sizeof(buf)); itoa(durITime,buf,10); AfxMessageBox(buf); return 1; } 本机测试,行!不过我觉得你CloseHandle(m_hThread1);CloseHandle(m_hThread2);太早了吧。还有a是全局变量,不过它从没改过值,应该没问题的。 CloseHandle有什么早不早的。你只要不需要就可以关闭。有时我会这样写CloseHandle((HANDLE)_beginthreadex(...)); 是的。CloseHanele只要不用就可把它关闭。 在tab控件中如何添加CTabSheet的成员变量 数据发送问题 100分求MSDN6.0中文版的下载址!? 请问怎样获得数据库中的字段名? 如何设置我的应用程序保存文件的后缀名? 三地招聘vc++程序员,想来的都可以试试看, 如何在Frame中得到View的指针 介绍几本SDK方面入门书籍 VC6写的程序通过ShellExecuteEx运行一个批处理文件,在win7下怎么不行啊 在摆渡人论坛发表的文章请他帮我,但问题依旧!谁能帮我? 抄表程序,文本框显示上下行通信数据帧问题,求思路:: vc 怎样选择word菜单的打印
这个理由太勉强了。首先判断两个线程是不是都创建成功了。
再看看任务管理器(调试器也可以)中程序是不是增加了线程在运行。
或者用其他更强大的系统信息查看工具看看程序的线程处于什么状态。运行,就绪,还是挂起。
我就试过,一个线程,死循环,双核都是100%。
windows内部管理多CPU用的是对称多处理器的方法。会尽量让多个CPU(多个核)之间负载平衡。其实这样做效率并不高,但在繁忙是可以完全利用CPU资源。
按楼上说的。
一个线程满负荷运行CPU占用刚好是50%,两个线程是100%,那如果是双CPU*双核,三个线程全负荷运行,CPU占用应该是多少呢?
而且对于线程满负荷运行这个说法,我还真是第一次看到。
而且window的cpu调度机制应该没有达到线程内的负荷平衡吧?
不过还有一种可能就是,一个程序使用哪个cpu是可以设置的,我知道任务管理器里面可以设置,估计用程序代码也应该可以设置吧?如果是这样的话,就有可能是有一个核没有利用起来
确实是可以设置进程的CPU亲缘关系。
但默认程序是运行可以在所有CPU上。也就是被windows安排尽量让多个CPU(核)平衡。
除非显式的调用过SetThreadAffinityMask或者SetProcessAffinityMask。或者父进程被设置了亲缘关系。
双核CPU,如果设置了只允许某个线程在其中一个核上运行。那就算这个线程是个死循环,系统总的CPU占用率也只有50%再多一些。多这部分由系统中其他运行的程序决定。但是。默认是全部占用。
HANDLE m_hThread1=NULL;
HANDLE m_hThread2=NULL;
HANDLE hEvent1=NULL;
HANDLE hEvent2=NULL;
long a=1000000000; DWORD WINAPI Thread1(LPVOID lpParameter)
{
double b=0;
for(int i=0; i<a/2; i++)
{
b = i + b;
}
SetEvent( hEvent1 );
return 1;
} DWORD WINAPI Thread2(LPVOID lpParameter)
{
double c=0;
for(int i=a/2; i<=a; i++)
{
c = i + c;
}
SetEvent( hEvent2 );
return 1;
} int testthread()
{ LONG ITime,durITime;
char buf[20];
double b=0;
ITime=GetCurrentTime();
hEvent1 = CreateEvent( NULL, FALSE, FALSE, NULL );
hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL );
m_hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
m_hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
CloseHandle(m_hThread1);
CloseHandle(m_hThread2);
WaitForSingleObject( hEvent1, INFINITE );
WaitForSingleObject( hEvent2, INFINITE ); durITime=GetCurrentTime()-ITime;
memset(buf,'\0',sizeof(buf));
itoa(durITime,buf,10);
AfxMessageBox(buf);
return 1;
}
不过我觉得你
CloseHandle(m_hThread1);
CloseHandle(m_hThread2);
太早了吧。
还有a是全局变量,不过它从没改过值,应该没问题的。
你只要不需要就可以关闭。
有时我会这样写
CloseHandle((HANDLE)_beginthreadex(...));