小编Ayu*_*nha的帖子

有没有办法在 Linux 上用 C++ 原子地刷新二进制信号量?

一些内核提供对信号量的“刷新”操作以解除对等待信号量的所有任务的阻塞。

例如,VxWorks 有一个semFlush() API,它可以原子地解除对指定信号量上挂起的所有任务的阻塞,即所有任务在允许运行之前都将被解除阻塞。

我正在 Linux 上实现一个 C++ 类,它的行为类似于二进制信号量,并且还具有这种“刷新”功能。不幸的是,Linux 上的semaphore.h不提供类似 API 的 flush() 或 broadcast() 。

我尝试过的:使用条件变量来实现二进制信号量。这是我的伪代码:

class BinarySem
{
    BinarySem();

    bool given;
    mutex m;
    condition_var cv;
    give();
    take();
    take( Timeout T );
    tryTake();
    flush();
}

BinarySem::BinarySem()
: given(false)
{}

// take(Timeout T), tryTake() not shown
// to make question concise on StackOverflow

BinarySem::give()
{
    {
        lock_guard lk(m);
        given = true;
    }
    cv.notify_one();
}   

BinarySem::flush()
{
    {
        lock_guard lk(m);
        given …
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading semaphore condition-variable

7
推荐指数
1
解决办法
198
查看次数