- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在编写一个使用线程来提高性能的简单应用程序。问题是,这个应用程序在 Windows 上运行良好,使用我的 CPU 的 2 个内核。但是当我在 Linux 上执行时,似乎只使用了 1 个核心。
我不明白为什么会这样。
这是我的代码,C++:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
void* function(void*)
{
int i=0;
for(i=0; i<1110111; i++)
rand();
return 0;
}
void withOutThreads(void)
{
function(0);
function(0);
}
void withThreads(void)
{
pthread_t* h1 = new pthread_t;
pthread_t* h2 = new pthread_t;
pthread_attr_t* atr = new pthread_attr_t;
pthread_attr_init(atr);
pthread_attr_setscope(atr,PTHREAD_SCOPE_SYSTEM);
pthread_create(h1,atr,function,0);
pthread_create(h2,atr,function,0);
pthread_join(*h1,0);
pthread_join(*h2,0);
pthread_attr_destroy(atr);
delete h1;
delete h2;
delete atr;
}
int main(void)
{
int ini,tim;
ini = clock();
withOutThreads();
tim = (int) ( 1000*(clock()-ini)/CLOCKS_PER_SEC );
printf("Time Sequential: %d ms\n",tim);
fflush(stdout);
ini = clock();
withThreads();
tim = (int) ( 1000*(clock()-ini)/CLOCKS_PER_SEC );
printf("Time Concurrent: %d ms\n",tim);
fflush(stdout);
return 0;
}
Linux 上的输出:
Time Sequential: 50 ms
Time Concurrent: 1610 ms
Windows 上的输出:
Time Sequential: 50 ms
Time Concurrent: 30 ms
最佳答案
clock() 在 windows 和 linux 上的工作方式不同,所以不要用它来测量时间。在 linux 上它测量 CPU 时间,在 Windows 上它测量挂钟时间。理想情况下,在这个测试用例中这些是相同的,但是您应该在平台之间使用一致的东西来测量时间。例如gettimeofday()
rand() 在 linux 上序列化你的线程。 rand() 持有一个内部锁以保证线程安全。 rand() 手册页指出 rand() 不是线程安全的,也不是可重入的,但是至少最近 glibc 中的代码在调用周围获得了锁。 我不确定 windows 是如何处理这个问题的,要么它根本不是线程安全的,要么它使用线程局部变量。
在linux上使用rand_r,或者找一些更好的CPU利用率函数来测量。
void* function(void*)
{
unsigned int seed = 42;
int i=0;
for(i=0; i<1110111; i++)
rand_r(&seed);
return 0;
}
关于c++ - Linux 上的 PThreads 和多核 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068697/
人们在运行TwistedWeb服务器时使用哪些技术来利用多个处理器/内核?有推荐的方法吗? 我基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8、
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
ZeroMQ 用于接收输入参数.. def server(): rep = context.socket(zmq.REP) rep.bind('tcp://*:{}'.format(P
我有一大组标量值分布在 3D 网格上(每个顶点一个值。) 我的目标是展示: 网格中值大于阈值的所有点。 并将连接的点分组(以简化显示。) 所以我的基本解决方案是: 找到通过阈值测试的点 对于每个没有被
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「 小牛呼噜噜 」 。 大家好,我是呼噜噜,
有没有办法让 J 使用多个核心?我认为 APL/J 的部分好处是语言结构很适合并行解决方案。 查看我的 CPU 使用率(我在 OSX 上),显然只有一个处理器在使用。 我有一个很重的函数 f 作用在一
多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断 最佳答案 这应该被视为 other answer
很长一段时间以来,我一直将 LLVM 视为我目前正在实现的语言的新后端。它似乎具有良好的性能,相当高级的生成 API,足够的低级支持来优化奇特的优化。此外,虽然我自己没有检查过,但苹果似乎已经成功地演
我最近开始研究低级OS编程。我(非常缓慢)目前正在研究两本较旧的书,即XINU和Build Your Own 32 Bit OS,以及上一个问题How to get started in operat
我正在阅读对新英特尔凌动 330 的评论,他们指出任务管理器显示 4 个内核 - 两个物理内核,另外还有两个由超线程模拟。 假设您有一个包含两个线程的程序。还假设这些是在 PC 上执行任何工作的唯一线
我不知道如何在 C++ 中进行线程化,我不仅不想知道,而且有没有一种方法可以将线程强制到不同的核心上?另外,我如何才能知道用户拥有多少个内核? 最佳答案 将线程绑定(bind)到任意 CPU 称为设置
如果需要在多核处理器机器的多个内核上并行执行,Linux 内核是否会同时执行多个上下文切换?有引用吗? 最佳答案 是的,你是对的。在 SMP 系统上,多个上下文切换同时发生。每个核心都可以独立进行上下
与进程相比,线程更不可能从多核处理器中获益,这是真的吗?换句话说,内核会决定在单核而不是多核上执行线程吗? 我说的是属于同一进程的线程。 最佳答案 我不知道(各种)Linux 调度程序如何处理这个问题
我需要一些帮助来决定在单个 Solr 实例中创建单个索引还是在单个 Solr 实例中创建多个核心,每个核心为一个索引提供服务。 我的理解是,solr 中的单个索引通常用于索引一种类型的文档。当您有不同
NGINX 或 Apache 是否受益于具有以下任一项的服务器: 多核,或者 多个处理器? 如果是,为什么? 最佳答案 使用多个 CPU/CPU 内核使服务器应用程序有机会并行处理多个客户端连接(和请
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID? NUMA 也是如此。
我有一些关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但当一个人为多核处理器/多处理器系统编写软件时,它会产生很多影响,因此在此询问!) 在多处理器系统或多
所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有
我经常听说其他语言被提升为更适合多核/并发编程,例如Clojure、Scala、Erlang 等,但我有点困惑为什么我需要担心多核问题,Java/.NET VM 不应该自动处理吗?如果没有,背后的原因
假设 x86 多核 PC 架构... 假设有 2 个内核(能够执行 2 个单独的指令流),并且 CPU 和 RAM 之间的接口(interface)是内存总线。 调度在 2 个不同内核上的 2 条指令
我是一名优秀的程序员,十分优秀!