我找到了关于pthreads 的以下主题(这里),但有很多很好的解决方案.
我想知道以下代码是否有效,如果是,为什么使用相同的锁来调用pthread_cond_wait以及访问它然后立即解锁:
void suspendMe()
{
pthread_mutex_lock(&m_SuspendMutex);
pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
pthread_mutex_unlock(&m_SuspendMutex);
}
Run Code Online (Sandbox Code Playgroud)
在这里使用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);
}
Run Code Online (Sandbox Code Playgroud)
再次感谢大家!:〜)
最近我开始将 ucos-ii 移植到 Ubuntu PC。
我们知道,在 pthread 的回调函数中,通过简单地在“while”循环中添加一个标志来执行暂停和恢复(如下面的解决方案)是不可能模拟 ucos-ii 中的“进程”的。因为ucos-ii中的“进程”可以随时暂停或恢复!
我在下面的网站上找到了一种解决方案,但无法构建,因为它已过时。它使用Linux中的进程来模拟ucos-ii中的任务(就像我们Linux中的进程)。
http://www2.hs-esslingen.de/~zimmerma/software/index_uk.html
如果pthread可以像进程那样随时暂停和恢复,请告诉我一些相关的功能,我自己能弄明白。如果不能,我想我应该专注于较旧的解决方案。非常感谢。
在Win32中,您可以通过在CREATE_SUSPENDED中使用dwCreationFlags参数来创建挂起模式的线程.我正在寻找与pthreads类似的功能.请注意,我不希望在运行它之后暂停该线程,然后使用条件变量暂停它,但实际上是在挂起模式下创建它,然后稍后启动它.
使用这种方法的优点是我可以在运行之前为该线程分配一些属性.例如,在启动之前将其绑定到某个核心,这比首次启动更有效,然后将其分配给核心,因为它可能会从一个核心移动到另一个核心.
如果不可能,我们至少可以在调用pthread_create时将线程绑定到核心吗?