值得注意的是,我已经在桌面环境中运行它,并且它按预期运行,但是当我使用uclibc在嵌入式环境中运行程序时会出现此问题.
为了排除故障,我将我的代码简化为执行锁定/解锁/信令的两个线程,如下所示:
#include <stdio.h>#include <pthread.h>#include <stdbool.h>pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIAliZER;pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIAliZER;pthread_cond_t condition1 = PTHREAD_COND_INITIAliZER;pthread_cond_t condition2 = PTHREAD_COND_INITIAliZER;bool predicate1 = false;bool predicate2 = false;static voID * ThreadFunc2(voID * arg) { sleep(1); // For testing purposes,ensures this thread is run after Thread1 pthread_mutex_lock(&mutex2); while(1) { pthread_mutex_lock(&mutex1); // Do some work - Eg receive some data from a socket predicate1 = false; pthread_cond_signal(&condition1); pthread_mutex_unlock(&mutex1); predicate2 = true; while(predicate2 == true) pthread_cond_wait(&condition2,&mutex2); // Do some more work - Eg send response data to socket }}static voID * ThreadFunc1(voID * arg) { int result; pthread_mutex_lock(&mutex1); while(1) { predicate1 = true; while(predicate1 == true) pthread_cond_wait(&condition1,&mutex1); // Do some work - Eg process data on the socket and prepare response data to be sent pthread_mutex_lock(&mutex2); predicate2 = false; pthread_cond_signal(&condition2); pthread_mutex_unlock(&mutex2); }}int main(int argc,char * argv[]) { pthread_t thread1ID,thread2ID; pthread_create(&thread1ID,NulL,ThreadFunc1,NulL); pthread_create(&thread2ID,ThreadFunc2,NulL); while(1) { sleep(1); } return 0;}
如果我排除了与mutex2 / condition2 / predicate2相关的所有语句,则两个线程按预期方式一起工作.
使用上面列出的代码,在短时间之后(因为所有工作都被剥离,每个循环运行得非常快),即使Threadfunc2发出信号通知导致应用程序停止,ThreadFunc1中的wait on条件1也不会唤醒.
另外为了帮助我调试,我重新定义了pthread_ *函数,在调用实际的pthread_ *函数之前使用匹配的行号将消息打印到stdout.这使我能够跟踪每个pthread *** 作的流程,并验证信号是否被发送到已经等待的状态.
任何人都可以帮我解释一下我上面实施过程中可能存在的任何潜在问题吗?
在此先感谢您的任何建议.
解决方法 您的错误是在调用pthread_cond_wait()之后,您没有解锁条件变量使用的互斥锁.例如,pthread_cond_wait()在线程被阻塞时在内部解锁互斥锁,但是当它被唤醒时你重新获取锁,你需要明确地释放它.
有关cond的更多详细信息,请参阅本教程.变量:https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables
总结以上是内存溢出为你收集整理的pthread等待状态并不总是在信号上唤醒全部内容,希望文章能够帮你解决pthread等待状态并不总是在信号上唤醒所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)