gpt4 book ai didi

c++ - 暂停和恢复 pthread 的最佳解决方案是什么?

转载 作者:IT老高 更新时间:2023-10-28 23:18:04 32 4
gpt4 key购买 nike

我发现了以下关于 pthread 的主题 (here),但有很多好的解决方案。

我想知道下面这段代码是否有效,如果有效,为什么要使用同一个锁来调用 pthread_cond_wait 以及访问它然后立即解锁:

void suspendMe()
{
pthread_mutex_lock(&m_SuspendMutex);
pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
pthread_mutex_unlock(&m_SuspendMutex);
}

在这里使用 2 个单独的互斥锁不是更好吗,或者这是挂起 pthread 的正确方法??

提前致谢!

编辑:

非常棒的回复,谢谢大家。还有一个相关的问题。既然我想在另一个函数中单独恢复一个线程,那么恢复它会更合适吗?

void suspendMe()
{
pthread_mutex_lock(&m_SuspendMutex);
pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
}
void resumeMe()
{
pthread_cond_signal(&m_ResumeCond);
pthread_mutex_unlock(&m_SuspendMutex);
}

再次感谢大家!! :~)

最佳答案

实际上,这段代码不是线程安全的。互斥锁实际上并没有保护任何东西,这使得隐含的谓词容易受到竞争条件的影响。

看看这段代码——什么是互斥锁保护的?什么保护挂起/恢复状态?

void suspendMe()
{
pthread_mutex_lock(&m_SuspendMutex);
pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
}
void resumeMe()
{
pthread_cond_signal(&m_ResumeCond);
pthread_mutex_unlock(&m_SuspendMutex);
}

这是正确的:

void suspendMe()
{ // tell the thread to suspend
pthread_mutex_lock(&m_SuspendMutex);
m_SuspendFlag = 1;
pthread_mutex_unlock(&m_SuspendMutex);
}
void resumeMe()
{ // tell the thread to resume
pthread_mutex_lock(&m_SuspendMutex);
m_SuspendFlag = 0;
phtread_cond_broadcast(&m_ResumeCond);
pthread_mutex_unlock(&m_SuspendMutex);
}
void checkSuspend()
{ // if suspended, suspend until resumed
pthread_mutex_lock(&m_SuspendMutex);
while (m_SuspendFlag != 0) pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
pthread_mutex_unlock(&m_SuspendMutex);
}

线程应该在可以挂起的安全点调用checkSuspend。其他线程可以调用 suspendMeresumeMe 来挂起/恢复线程。

请注意,现在互斥锁保护了 m_SuspendFlag 变量,确保线程被告知暂停,被告知恢复,并检查它是否应该暂停或在保护下保持暂停,使代码线程-安全。

Would it not be better to use 2 separate mutexes here, or is this the correct way to suspend a pthread??

使用两个互斥锁会破坏整个条件变量点。它们工作的整个机制是,您可以检查是否有您应该等待的东西,然后自动等待它,而无需在等待时持有锁或必须释放锁然后等待。如果您在等待时持有锁,那么其他线程如何更改状态?如果你释放锁然后等待,如果你错过了状态变化会发生什么?

顺便说一句,暂停或恢复线程几乎没有意义。如果你觉得你需要从外部暂停一个线程,那只是表明你对线程进行了编码来做一些你实际上并不希望它做的事情。关于暂停或恢复线程的问题通常表明线程编程的心理模型不正确。一个线程可能需要等待某事,但它不应该从外部“暂停”,因为它应该已经通过自己的编码知道什么时候它不应该做一些特定的工作。

关于c++ - 暂停和恢复 pthread 的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13662689/

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