gpt4 book ai didi

c++ - 当两个线程同时尝试对同一个互斥量执行 try_lock() 时会发生什么情况?

转载 作者:行者123 更新时间:2023-11-28 01:19:58 27 4
gpt4 key购买 nike

这是我的第二篇文章。我的第一篇文章是从 Intro 到 C 类的本科生。我希望这次我能做得更好。

我正在为我的研究开发一个随机模型,我正在寻找提高算法计算效率的方法。我最近被同事介绍了多线程,我已经成功地将它实现到我的一些不需要锁的算法中......

现在我正在尝试修改/线程化一个需要锁的算法。在我的文献/StackOverflow/google 搜索中,我学到了很多关于 mutex 类的知识。但是,我面临的问题似乎是独一无二的。对于上下文,我能找到的最接近答案的是这里:

What happens when two threads ATTEMPT to lock the same resource at the exact same time?

它仍然没有直接解决我要问的问题。

我一直在尝试使用动态分配的指向互斥对象的指针数组来控制线程之间的内存访问。我的代码在没有警告/错误的情况下编译(使用标志 -pthread -std=c++11 编译),并且在抛出段错误的线程算法之前完美执行。在使用 lldb 进行调查后,我发现抛出的异常如下:

lldb output screenshot

经过进一步调查,我发现 lldb 输出引用的线程都在尝试对完全相同的互斥对象执行 try_lock(),因为包含该对象地址的指针数组已传递给每个线程。

我的问题与之前提到的帖子类似:

当多个线程(多个线程)在完全相同的时间(处理器时钟的同一行程)在同一个互斥锁上尝试 try_lock() 时会发生什么? mutex 类的较新实现是否有解决这个看似灾难性事件的方法(即 shard_mutex、timed_mutex 等)?

这最近让我大吃一惊,所以任何见解都将不胜感激。非常感谢 S/O 社区提供的所有帮助,包括这篇文章和所有其他对我作为程序员的成长非常宝贵的帮助。

代码链接:

https://github.com/tylerbalbright/StackOverflow_7_4.git

RVEdata.cpp 的第 751 行或第 857 行发生错误。

已修复但未解决:

我能够使用互斥对象的双端队列来修复我的代码,而不是创建指向动态创建的互斥对象的指针 vector 。该解决方案已由其他用户在此处提出:

How can I use something like std::vector<std::mutex>?

在我的第一次(不成功的)试验中,我试图创建一个指向互斥锁的指针数组,如下所示:

long int N = RuntimeVector.size(); //Varying size at runtime
std::mutex *MutexPtrs;
MutexPtrs = new std::mutex[N];

然后我会将新创建的数组作为指针传递给一个函数,该函数会将指向数组的指针传递给一个新线程,如下所示:

void SomeFunction(std::mutex *PosLocks[])
{
.
..
...

SearchersPos.push_back(std::async(std::launch::async, &RVEdata::PositiveSearch, this, PosLocks));
}

使用这种方法,代码不会在每次执行时都失败,但它有 90% 的时间都因 EXC_BAD_ACCESS 而失败。有趣的是,在每次执行失败时,当多个线程试图 try_lock 同一个互斥锁时,就会抛出错误的访问。它从来没有因为只有 1 个线程在一个单独的互斥体上尝试 try_lock 而失败。当我在我们的 HPC 上运行相同的代码时,大约 95% 的时间都会发生故障,但我无法在 gdb 中找到像在 lldb 中那样多的信息(我对命令行 gdb 不太熟练)。

PS - 我在 macOS High Sierra 10.13.6、Apple LLVM 版本 10.0.0 (clang-1000.11.45.5) 上运行。

最佳答案

当多个线程同时尝试锁定时,其中一个线程以锁定结束,而其他线程失败。

你的公主 bug 在另一座城堡是由其他原因引起的。

关于c++ - 当两个线程同时尝试对同一个互斥量执行 try_lock() 时会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56893030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com