2014-03-12 36 views
0

我使用eCos在嵌入式系统上工作: 我在同一进程和1个信号中有2个线程。为什么sem_timedwait()没有醒来?

  1. 线程A将信号量初始化为0,以便第一次尝试接受它将会阻塞。
  2. 线程A向线程B发送一个命令,提供回调。在信号量
  3. 线程A等待与sem_timedwait
  4. 线程B进程的命令,并增加信号量
  5. 线程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中的内容不相关。

调试我试过如下:

  1. 使用sem_wait而不是sem_timedwait工作:线程A被阻塞,则回调之后解锁。但我不想使用它,因为如果在回调过程中出现阻止信号量递增的失败,线程A将永远等待。
  2. 如果我不在timespec结构中添加2,立即返回sem_timedwait,并且errno设置为ETIMEDOUT(看起来合法)。回调被调用,但对于线程A来说太迟了。
  3. 我在回调调用中放置了跟踪以确保信号量确实从0增加到1:所有过程完成,回调退出但线程A仍然受阻。

你们有什么线索吗?我错过了什么吗?

回答

0

确实如此,实际上一切都很好,这个问题在其他地方:我有一个导致死锁的重新入口问题。
道德:在多线程环境中谨慎保护您的资源和地址