sem_init() 的 man 手册中说:"对已经初始化的信号量进行初始化将导致未定义的行为。" 为什么会这样,Linux 中会发生什么?
我觉得这没什么道理,因为当您第一次调用 sem_init() 时,未初始化的 sem_t 可能与已初始化的 sem_t 具有完全相同的内容 -- 如果手册是正确的,则 sem_init() 简单地不起作用。
sem_init() 的 man 手册中说:"对已经初始化的信号量进行初始化将导致未定义的行为。" 为什么会这样,Linux 中会发生什么?
我觉得这没什么道理,因为当您第一次调用 sem_init() 时,未初始化的 sem_t 可能与已初始化的 sem_t 具有完全相同的内容 -- 如果手册是正确的,则 sem_init() 简单地不起作用。
sem_init
只是填充了sem_t
结构成员,因此如果多次调用它,不会发生任何不良反应。然而,一般情况下可能会发生更糟糕的事情。sem_t
只是一个包含指向已分配对象的指针的虚拟对象(注意:这对于进程共享的信号量是行不通的),则通过多次调用sem_init
将泄漏内存。sem_t
只是包含对内核管理资源的引用(如文件描述符号码),则通过多次调用sem_init
将泄漏这些内核资源。sem_t
对象内部使用prev/next指针维护所有实例化信号量的链接列表(这也不可能适用于进程共享的情况),则通过在已经是列表一部分的sem_t
上调用sem_init
将破坏这个列表。