将linux内核信号量初始化为负数合法吗?

将linux内核信号量初始化为负数合法吗?,linux,linux-kernel,Linux,Linux Kernel,假设我想在n个单独的事件发生后唤醒一个任务。将信号量初始化为1-n并将其向下()是否合法,这样我在每个事件都将其向上()后醒来?我不这么认为 (1) semephore.count声明为unsigned int。请参阅信号量定义: struct semaphore { spinlock_t lock; unsigned int count; struct list_head wait_list; };

假设我想在n个单独的事件发生后唤醒一个任务。将信号量初始化为1-n并将其向下()是否合法,这样我在每个事件都将其向上()后醒来?

我不这么认为

(1) semephore.count声明为unsigned int。请参阅信号量定义:

    struct semaphore {
        spinlock_t      lock;
        unsigned int        count;
        struct list_head    wait_list;
    };
(2) 函数的作用是:在减少计数之前先检查计数值,确保计数不是负值


除非您实现一种机制,否则无法直接使用信号量来实现您的需求。

计数是无符号的,因此当您认为将其设置为负数时,它实际上是一个非常大的正数。所以不,你不能。这不是一个好主意,因为它没有签名。此外,信号量只有在为正数时才会被激活,因此如果将信号量初始化为负数而导致的数字较大,则会导致您的信号量允许访问您希望限制的内容。

谢谢。我在看一个旧内核,它的计数是原子-t,但我认为在你的例子中,你仍然适合旧内核的totry条件变量。