wei*_*wei 5 c linux multithreading pthreads
我目前正在使用条件变量来同步两个线程(pthreads)并且我得到了一个意外的行为,即使我已经验证了一个线程已经在某个条件上等待,它也不会在另一个线程发出信号的情况下被唤醒.
值得注意的是,我已经在桌面环境中运行它,并且它按预期运行,但是当我使用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, NULL, ThreadFunc2, NULL);
while(1) {
sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我排除了与mutex2/condition2/predicate2相关的所有语句,则两个线程按预期方式一起工作.
使用上面列出的代码,在短时间之后(因为所有工作都被剥离,每个循环运行得非常快),即使Threadfunc2发出信号通知导致应用程序停止,ThreadFunc1中的wait on条件1也不会唤醒.
另外为了帮助我调试,我重新定义了pthread_*函数,在调用实际的pthread_*函数之前使用匹配的行号将消息打印到stdout.这使我能够跟踪每个pthread操作的流程,并验证信号是否被发送到已经等待的状态.
任何人都可以帮我解释一下我上面实施过程中可能存在的任何潜在问题吗?
在此先感谢您的任何建议.
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |