为什么sem_timedwait()没有醒来?

时间:2014-03-12 08:53:27

标签: c time semaphore thread-synchronization

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

  1. 线程A将信号量初始化为0,以便第一次尝试接收它将阻止。
  2. 线程A向线程B发送命令,提供回调。
  3. 主题A等待sem_timedwait
  4. 的信号量
  5. 线程B处理命令并递增信号量
  6. 线程A应该被唤醒但仍然被阻止
  7. 以下是代码:

    主题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中的内容无关紧要。

    对于调试我尝试了以下内容:

    1. 使用sem_wait而不是sem_timedwait 工作:线程A被阻止,然后在回调后解锁。但是我不想使用它,因为如果回调过程中出现了阻止信号量增加的故障,则线程A将永远等待。
    2. 如果我没有将2添加到timespec结构中,则sem_timedwait立即返回,errno设置为ETIMEDOUT(似乎合法)。调用回调,但对于线程A来说为时已晚。
    3. 我在回调调用中放置了跟踪以确保信号量确实从0增加到1:所有进程都完成,回调退出但线程A仍然被阻止。
    4. 你们有什么线索吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

好吧所以实际上这个代码一切都很好,问题出在其他地方:我有一个重新进入的问题导致了僵局。
道德:在多线程环境中小心保护您的资源和地址