- 主题:经典死锁
除了这种交叉加锁,
void Foo()
{
std::lock_guard guard1{m_mutex1};
std::lock_guard guard2{m_mutex2};
...
}
void Bar()
{
std::lock_guard guard2{m_mutex2};
std::lock_guard guard1{m_mutex1};
...
}
看到好多这种死锁:
int ThreadProc() {
...
std::lock_guard guard{m_mutex};
...
}
void StopThread()
{
std::lock_guard guard{m_mutex};
if (m_thread != nullptr)
{
m_thread->join();
delete m_thread;
m_thread = nullptr;
}
}
--
FROM 114.241.228.*
没人这么用吧!
【 在 z16166 的大作中提到: 】
: 除了这种交叉加锁,
: void Foo()
: {
: ...................
--
FROM 221.218.60.*
你的意思是这么用的不是人吗?哈哈
【 在 ylh1969 的大作中提到: 】
: 没人这么用吧!
--
FROM 114.241.228.*
有成功的吗?
【 在 z16166 的大作中提到: 】
: 你的意思是这么用的不是人吗?哈哈
:
--
FROM 221.218.60.*
那只能说明您老用得少
1、std::scoped_lock就是用来解决交叉加锁的,先try_lock试探一下。当然,不加双锁最好了
2、拿着锁去join那些可能会请求锁的线程的,我看到不止3起了。
【 在 ylh1969 的大作中提到: 】
: 有成功的吗?
--
FROM 114.241.228.*
失败了找你去解决的吧。
【 在 z16166 的大作中提到: 】
: 那只能说明您老用得少
: 1、std::scoped_lock就是用来解决交叉加锁的,先try_lock试探一下。当然,不加双锁最好了
: 2、拿着锁去join那些可能会请求锁的线程的,我看到不止3起了。
: ...................
--
FROM 221.218.60.*
这种地方应该是典型用 atomic_flag [[unlikely]]
--
FROM 125.119.103.*
用eventfd等吧,每个线程结束前写一下eventfd,主线程为每个线程设置eventfd,加到epoll里,然后等待epoll。
【 在 z16166 的大作中提到: 】
: 除了这种交叉加锁,
: void Foo()
: {
: ...................
--
FROM 221.218.60.*