【发布时间】:2014-11-09 12:42:19
【问题描述】:
我正在重写现有的实时内核TNKernel;我已经使用它几年了,但我不喜欢它的许多设计决策(以及实现细节),所以我决定分叉它并享受实现我想要的东西的乐趣。有兴趣的朋友可以在project page on bitbucket阅读更多信息。
在我看来,TNKernel 有一个奇怪的特性:它有服务 tn_task_sleep(int timeout) 使当前任务进入睡眠状态,它有 tn_task_wakeup(struct TN_Task *task) 唤醒当前睡眠任务。
奇怪的是在非睡眠任务上调用tn_task_wakeup()是合法的;在这种情况下,像wakeup_request 这样的特殊标志将被设置,并且在下次调用tn_task_sleep() 时,该标志将被清除,并且任务不会休眠。
在我看来,所有这些都是完全肮脏的 hack,它可能被用作避免竞争条件问题的解决方法,或者作为信号量的 hacky 替代品。
它只是鼓励程序员采用 hacky 方法,而不是创建简单的信号量并提供适当的同步。所以,我愿意从我的项目中删除这项服务。这是摆脱它的好主意,还是我错过了一些重要的事情?为什么我们需要它?
【问题讨论】:
-
这听起来更像是一个错误,因为文档指出如果任务尚未处于 SUSPENDED 或 WAITING_SUSPENDED 状态,则 tn_task_resume 应该返回错误。
-
@nos,哦,出于某种原因,我在我的问题中混淆了,请抱歉:当然我的意思是
tn_task_wakeup(),而不是tn_task_resume()(这与暂停,不睡觉有关任务)。顺便说一下,关于tn_task_wakeup(): doc 声明:“如果任务未处于睡眠模式,则任务的唤醒请求排队并且唤醒请求计数器加 1”,但是如果您查看源代码,则该计数器的预期最大值为:1,因此它本质上是一个标志。无论如何,这在我看来是一种肮脏的黑客行为。
标签: multithreading sleep rtos wakeup