在Linux系统下,执行sem_timewait(),在等待锁的期间,当前线程会睡眠还是阻塞

Sheldon
  • 24

在Linux系统下,执行sem_timewait(),在等待锁的期间,当前线程会睡眠,选择其它线程执行,还是在原地阻塞,直到超时?

超时以后,如果还没获取到锁,是睡眠当前进程,还是阻塞当前进程?

回复
阅读 2.4k
2 个回答
✓ 已被采纳

如果你说的是 sem_timedwait

我印象中,只有自旋锁会在原地阻塞,而其他同步机制都是会睡眠。

第二个问题在 man 手册中有提到,当超时还没有获得锁,函数会以 timeout 的错误失败返回,errno 会设置 ETIMEDOUT

If the timeout has already expired by the time of the call, and the semaphore could not be locked immediately, then sem_timedwait() fails with a timeout error (errno set to ETIMEDOUT).

sem_timewait 函数会阻塞当前线程直到拿到锁或超时才会返回。阻塞的实现方式就是休眠当前线程,直到锁释放或者超时后唤醒。
超时后这个函数返回继续执行后面的代码,后面的代码逻辑决定后面的行为。

休眠是阻塞的一种实现或者说表现方式,二者不是一个层面的概念。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏