C 为什么sem_timedwait()没有醒来?

C 为什么sem_timedwait()没有醒来?,c,time,semaphore,thread-synchronization,C,Time,Semaphore,Thread Synchronization,我在使用eCos的嵌入式系统上工作: 我在同一进程中有两个线程和一个信号量 线程A将信号量初始化为0,以便第一次尝试获取它时将被阻止 线程A向线程B发送命令,提供回调 线程A使用sem\u timedwait 线程B处理该命令并增加信号量 线程A应该被唤醒,但仍然被阻塞 代码如下: 线程A static sem_t semaphore; void callback() { // Do some stuff int ret = sem_post(&semaphore);

我在使用eCos的嵌入式系统上工作: 我在同一进程中有两个线程和一个信号量

  • 线程A将信号量初始化为0,以便第一次尝试获取它时将被阻止
  • 线程A向线程B发送命令,提供回调
  • 线程A使用
    sem\u timedwait
  • 线程B处理该命令并增加信号量
  • 线程A应该被唤醒,但仍然被阻塞
  • 代码如下:

    线程A

    static sem_t semaphore;
    
    void callback()
    {
        // Do some stuff
        int ret = sem_post(&semaphore);
        // print confirmation message
    }
    
    void foo()
    {
        int ret = sem_init(&semaphore, 0, 0);
        if(ret != 0)
        {
            // print errno
        }
    
        struct timespec ts; 
        clock_gettime(CLOCK_REALTIME,&ts); // Get current date
        ts.tv_sec += 2; // Add 2s for the deadline
    
        send_command_to_thread_B(&callback);
    
        ret = sem_timedwait(&semaphore, &ts);
        if(ret != 0)
        {
            // print errno
        }
    
        // print waking up message
    }
    
    线程B中的内容不相关

    对于调试,我尝试了以下操作:

  • 使用
    sem_wait
    而不是
    sem_timedwait
    有效:线程A被阻塞,然后在回调后解锁。但我不想使用它,因为如果回调过程中出现了阻止信号量递增的故障,线程a将永远等待
  • 如果我不将2添加到
    timespec
    结构中,
    sem\u timedwait
    立即返回,并且
    errno
    设置为
    ETIMEDOUT
    (似乎合法)。调用了回调,但对于线程A来说已经太晚了
  • 我在回调调用中进行跟踪,以确保信号量确实从0增加到1:所有进程都完成了,回调退出,但线程A仍然被阻塞

  • 你们有什么线索吗?我遗漏了什么吗?

    好的,实际上这段代码一切正常,问题出在别处:我遇到了导致死锁的重新进入问题。

    寓意:在多线程环境中小心保护您的资源和地址

    先生,您能详细描述一下您的重新登录问题吗?我不明白有什么可能导致这个问题。我的分析有缺陷。我同时调用了一个函数,等待一个未释放的锁。执行被阻止了,但不像我想的那样在信号灯上。为我辩护,那是6年前的事了。