0
我使用eCos在嵌入式系统上工作: 我在同一进程和1个信号中有2个线程。为什么sem_timedwait()没有醒来?
- 线程A将信号量初始化为0,以便第一次尝试接受它将会阻塞。
- 线程A向线程B发送一个命令,提供回调。在信号量
- 线程A等待与
sem_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将永远等待。 - 如果我不在
timespec
结构中添加2,立即返回sem_timedwait
,并且errno
设置为ETIMEDOUT
(看起来合法)。回调被调用,但对于线程A来说太迟了。 - 我在回调调用中放置了跟踪以确保信号量确实从0增加到1:所有过程完成,回调退出但线程A仍然受阻。
你们有什么线索吗?我错过了什么吗?