我在使用eCos的嵌入式系统上工作: 我在同一个进程中有2个线程和1个信号量。
sem_timedwait
以下是代码:
主题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
结构中,则sem_timedwait
立即返回,errno
设置为ETIMEDOUT
(似乎合法)。调用回调,但对于线程A来说为时已晚。你们有什么线索吗?我错过了什么吗?
答案 0 :(得分:0)
好吧所以实际上这个代码一切都很好,问题出在其他地方:我有一个重新进入的问题导致了僵局。
道德:在多线程环境中小心保护您的资源和地址