在C++中使用线程查找友好号码比单个线程花费更多时间

Using threading to find amicable number is taking more time than single thread in C++

本文关键字:线程 单个 时间 号码 C++ 查找      更新时间:2023-10-16

我正在使用两个函数:i.find_divisor((:找到一个数字的所有除数和ii.findAmicable number,以找到C++中给定限制的友好对。 以下是查找友好配对的代码:

void find_pair() {
while (counter < limit) {
int first_num = counter;
{
lock_guard<mutex> guard(myMutex);
counter++;
int sec_num = find_divisor(first_num);
if (sec_num > first_num && first_num == find_divisor(sec_num)) {
pairvector.push_back({ first_num,sec_num });
}
}
}
}

我从main((调用这个函数。 计数器和对向量都是全局变量,我正在从主打印对。对于限制 100000,使用 1 个线程我在 596 毫秒内得到结果,而使用 18 个线程需要 1507 毫秒。我是线程概念和锁的新手。如果我不使用锁定,我会得到一些重复/或缺失的值,如果我使用锁,多线程所花费的时间比单线程长。谁能帮我如何通过多线程获得更好的性能。任何帮助,不胜感激。谢谢

你对所有线程使用mutex保护,这意味着只有一个线程可以并行通过这些行:

counter++;
int sec_num = find_divisor(first_num);
if (sec_num > first_num && first_num == find_divisor(sec_num)) {
pairvector.push_back({ first_num,sec_num });
}

如果另一个线程想在同一时间内传递它们,它将等到第一个线程完成。现在,线程必须从操作系统获取订单才能开始运行,并且可以并行运行的最大线程数仅限于计算机拥有的核心数。现在,如果你的内核较少,那么线程(或者如果操作系统为同一核心提供了多个线程(,你的一些线程将进入等待时间,直到它们获得从操作系统再次运行的权限。

让我们测试一个案例:
操作系统:8 个内核。
第一个线程获得权限并进入受保护的行。
第二个线程开始运行并等待第一个线程从受保护的线路退出。
其余的都陷入了第二个的情况,但现在,其中一些正在与第一个相同的核心上工作。操作系统现在会将第一个线程发送到等待时间,并允许其中一个卡住的线程运行。但是,第一个仍然留在受保护的线上,所以还没有人可以越过它们。在这种情况下,所有线程都在等待第一个线程
,第一个线程正在等待来自操作系统的许可。 一段时间后,操作系统让第一个线程获得权限,它从受保护的线路退出 - 但是,它花了更长的时间,因为有一个等待时间。
这种情况是过度的案例,这里仅供说明

如何解决?

尽量保护尽可能少的行,这样线程中就会有更多的并行位置。