【发布时间】:2016-07-01 15:55:49
【问题描述】:
libuv中的句柄必须在使用前进行初始化。
它们都有一个关联的uv_<handle>_init 函数。例如,uv_timer_t 有一个关联函数 uv_timer_init 来初始化它。
也就是说,如果我多次调用给定句柄的 init 函数,我注意到 libuv 具有未定义的行为。
一旦我关闭循环并执行一堆无效的读/写操作,它就会显示问题。
有没有办法知道句柄是否已经初始化?
例如,要知道句柄是关闭还是关闭,存在函数uv_is_closing。
是否有类似的函数可以知道句柄是否已经初始化?
【问题讨论】:
-
您可以使用数据结构来跟踪已初始化的变量,如果它们的类型相同,您可以定义自己的哈希函数并执行查找。或者,您可以将变量名称存储在这样的结构中,但我不建议这样做,因为重命名变量变得很麻烦。
-
在多次调用 init 函数时遇到未定义行为这一事实肯定暗示了答案是“你不能”的假设 - 否则库将能够自己检测到它。 .
-
@tofro 我不这么认为。一个例子是
uv_close函数。你不应该调用它两次,你有uv_is_closing函数来检查它是否已经关闭。 -
手柄就像一张支票。只是一张上面有数字的纸,当你把它带到银行兑现时,很多机器在后台呼呼作响。把它带到银行两次或根本没有,好吧,你可以想象。编程就是要做出明智的决定。
-
@HansPassant 那么,为什么存在
uv_is_active并且它可以与uv_timer一起使用?想要启动汽车引擎两次而不停止它听起来不是一个好的决定。它的目的是了解它是否已经开始。我在问是否有一个等效的函数可以用来知道它是否已经初始化。很简单的一个问题,不是吗?