我做了一个小程序来观察使用两个线程的速度。我正在计时一个填充数组的过程。A主线程和thread1调用function_1来对数组的不同部分进行定义。我希望通过使用两个线程看到更快的结果。相反,我的时间变慢了,注释掉的代码执行得更快。我这是怎么回事?
#include <chrono>
#include <iostream>
#include <vector>
#include <thread>
void function_1(int I, int J, int *B){
for (int i = I; i<(J+1); i++) {
B[i] = 100;
//std::cout << B[i] << std::endl;
}
}
int *count;
int main(int argc, const char * argv[])
{
count = new int[20000];
std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
//function_1(0, 19999, count);
std::thread thread1(function_1, 0, 9999, count);
thread1.join();
function_1(10000, 19999, count);
std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
auto time_span = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
std::cout << "time taken is :" <<time_span << " ms"<<std::endl;
return 0;
}发布于 2014-01-25 01:32:40
在创建示例代码后立即加入thread1,从而同步执行示例代码。main()中的执行将被阻塞,直到该线程终止处理,然后移动到function_1(10000, 19999, count);,以便利用额外的线程,在main中调用function_1(10000, 19999, count);之后尝试移动连接调用。
发布于 2014-01-25 01:33:38
std::thread thread1(function_1, 0, 9999, count);
thread1.join();
function_1(10000, 19999, count);主线程将等待thread1在调用function_1之前完成工作。这和打电话一样
function_1(...)
function_1(...)在主线程上,只有管理线程所带来的额外成本。在主线程上调用join()之后,您可能需要function_1。
此外,您应该增加工作负载,以使测试更加相关。线程并不是一种快速完成工作的免费方式。在决定线程是否与您的情况相关之前,您需要考虑维护线程的成本。
发布于 2014-01-25 06:04:23
当手头的任务只包括填充内存时,您不太可能看到重大的改进。
问题很简单:一个单一的核心可能会使您的全部带宽饱和到内存中。在这种情况下,添加更多的线程不会有多大好处,除非您有一台具有多个处理器的计算机,而不仅仅是一个套接字中的多个核。
使用多个套接字,您可以通过在不同的物理处理器上运行不同的线程来提高速度,每个线程都有自己的内存连接。但是,要使其有效,通常需要使用一些非标准函数调用,以确保每个线程在单独的物理处理器上运行,并确保在每个处理器上运行的线程写入该处理器的本地内存。
这两者都不是火箭科学,但它们也不一定是微不足道的。即使在最简单的情况下,至少有一点代码是不可移植的。
要从多个线程中获得重大收益,您通常希望执行的任务包括各种不同类型的工作的混合:例如,一些是I/O绑定,一些是内存绑定,另一些是处理器绑定。在这种情况下,从多个线程获得实质性的加速要容易得多。如果您不能这样做,那么很可能是第二种选择。假设线程之间的同步很少或不同步,则很有可能得到大致线性加速比(即N个内核执行代码的速度比一个核心快N倍)。
https://stackoverflow.com/questions/21345375
复制相似问题