加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

pthread等待状态并不总是在信号上唤醒

发布时间:2020-12-16 05:03:49 所属栏目:百科 来源:网络整理
导读:我目前正在使用条件变量来同步两个线程(pthreads)并且我得到了一个意外的行为,即使我已经验证了一个线程已经在某个条件上等待,它也不会在另一个线程发出信号的情况下被唤醒. 值得注意的是,我已经在桌面环境中运行它,并且它按预期运行,但是当我使用uclibc在嵌
我目前正在使用条件变量来同步两个线程(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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读