基于atomic_flag的简易C++互斥锁代码join时抛异常求助
我先梳理下你的场景:你正在尝试用atomic_flag配合acquire/release内存模型实现一个极简互斥锁,用来同步多个线程对count变量的递增操作——创建了THREADS个线程,每个线程执行LOOP次递增,但运行时在thread.join()处抛出了异常,想找出问题根源对吧?
你给出的代码片段如下:
#include <atomic> #include <thread> #include <assert.h> #include <vector> using nam...
由于代码不完整,我结合常见的join()异常场景和atomic_flag互斥锁的典型错误,给你列出几个最可能的原因:
1. 线程对象被重复调用join()
std::thread对象在第一次调用join()后会进入"非可结合"状态,如果后续再次对同一个线程对象调用join(),就会触发std::system_error异常。比如你的线程容器遍历逻辑出错,或者某个线程被意外重复处理,就会出现这种情况。
2. 自定义互斥锁的lock/unlock逻辑存在致命错误
atomic_flag的正确使用有几个关键细节,一旦出错会直接导致线程行为异常:
- 必须用
ATOMIC_FLAG_INIT初始化atomic_flag,否则初始状态未定义 - lock操作需要循环调用
test_and_set(std::memory_order_acquire),直到获取锁成功(因为单次test_and_set可能返回true,说明锁已被其他线程持有) - unlock操作必须调用
clear(std::memory_order_release)来释放锁
如果你的lock逻辑没做循环、unlock用了错误的操作,会导致要么多个线程同时进入临界区引发数据竞争,要么锁永远无法释放导致线程卡死,最终都会引发线程异常终止,进而在join()时抛出异常。
3. 存在未关联实际线程的空thread对象
如果你的线程容器里有默认构造的std::thread对象(没有绑定任何线程函数),调用join()时也会抛出异常——因为默认构造的线程对象本身就是"非可结合"状态。比如THREADS数值设置有误,或者容器初始化时多创建了空线程对象,就会出现这种问题。
4. 线程执行中存在未捕获的异常
如果你的线程函数内部(比如临界区的递增操作、assert检查)抛出了未捕获的异常,线程会直接终止。虽然这种情况不会直接导致join()抛出异常,但线程异常终止可能引发后续逻辑错误,间接触发join()相关的异常。
建议你补充完整代码,尤其是自定义互斥锁的lock/unlock实现、线程函数逻辑以及线程容器的创建遍历代码,这样能更精准定位问题。不过优先检查上述几个方向,应该能找到线索。
内容的提问来源于stack exchange,提问作者Alan Zeng

