C 为什么sem_timedwait()没有醒来?
我在使用eCos的嵌入式系统上工作: 我在同一进程中有两个线程和一个信号量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);
sem\u timedwait
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\u timedwait
立即返回,并且errno
设置为ETIMEDOUT
(似乎合法)。调用了回调,但对于线程A来说已经太晚了你们有什么线索吗?我遗漏了什么吗?好的,实际上这段代码一切正常,问题出在别处:我遇到了导致死锁的重新进入问题。
寓意:在多线程环境中小心保护您的资源和地址先生,您能详细描述一下您的重新登录问题吗?我不明白有什么可能导致这个问题。我的分析有缺陷。我同时调用了一个函数,等待一个未释放的锁。执行被阻止了,但不像我想的那样在信号灯上。为我辩护,那是6年前的事了。