在C++中使用线程查找友好号码比单个线程花费更多时间
Using threading to find amicable number is taking more time than single thread in C++
我正在使用两个函数: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 个内核。
第一个线程获得权限并进入受保护的行。
第二个线程开始运行并等待第一个线程从受保护的线路退出。
其余的都陷入了第二个的情况,但现在,其中一些正在与第一个相同的核心上工作。操作系统现在会将第一个线程发送到等待时间,并允许其中一个卡住的线程运行。但是,第一个仍然留在受保护的线上,所以还没有人可以越过它们。在这种情况下,所有线程都在等待第一个线程
,第一个线程正在等待来自操作系统的许可。 一段时间后,操作系统让第一个线程获得权限,它从受保护的线路退出 - 但是,它花了更长的时间,因为有一个等待时间。
这种情况是过度的案例,这里仅供说明
如何解决?
尽量保护尽可能少的行,这样线程中就会有更多的并行位置。
- 在C++中使用线程查找友好号码比单个线程花费更多时间
- 如何使用 TBB 在单个线程中运行函数
- 有人可以解释为什么使用 OpenMP 部分的运行速度比单个线程慢吗?
- 为什么向量"emplace_back"在多个线程中的行为比单个线程慢得多
- 通过创建单个线程来运行一段代码可加快执行速度
- 线程安全 std::map:锁定整个映射和单个值
- 是多个线程渲染到单个OpenGL上下文线程安全的线程
- 在C 中将多个客户端连接到Windows中的单个服务器中的多线程
- 为多个对象创建单个线程
- 在 C++98 中写入单个字符串以"线程安全"吗
- asio::strand 上的任务在单个线程上运行
- C 如果一个线程写入Bool曾经完成,则可以安全地阅读单个线程中的循环中的Bool
- C 中单个对象的线程安全容器
- 线程安全:多个线程从单个常量源读取
- 单个变量的线程安全
- 在单个链表中擦除和插入线程安全吗
- 避免单个线程中的死锁
- 期货是检查单个线程完成情况的安全方法吗
- 在C++中将所有TLS(线程本地存储)变量设置为新的单个值
- 我们是否需要每个线程多个io_service用于具有单个接受器的线程 boost::asio 服务器