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

c – 暂停和恢复pthread的最佳解决方案是什么?,第1张

概述我找到了关于pthread的以下主题( here),但有很多好的解决方案. 我想知道下面的代码是否有效,如果是这样,为什么同一个锁被用来调用pthread_cond_wait以及访问它,然后立即解锁: void suspendMe(){ pthread_mutex_lock(&m_SuspendMutex); pthread_cond_wait(&m_ResumeCond, &m 我找到了关于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.其他线程可以调用suspendMe和resumeMe挂起/恢复线程.

请注意,现在mutex保护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的最佳解决方案是什么?全部内容,希望文章能够帮你解决c – 暂停和恢复pthread的最佳解决方案是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1256555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存