简体   繁体   中英

Testing locklessness C++

Is there any way to detect whether a function or thread is blocking? I want to build a test case in which I can test whether a function is hard realtime-safe.

No. There is no general way to do this.

There are many ways to 'block' such as a spin-lock and similar 'try-fail-retry' algorithms that there's no realistic way to instrument what code 'blocks'.

Look at something like a sequential lock. That's a lock that never blocks a (single) writer but causes readers to re-try if they make have made a read during a write (and so may have read a corrupt value).

It scales in readers really well particularly if writes are relatively infrequent. Certainly the important point being readers don't block each other so the delay on reads is a fixed value as readers scale.

It's debatable whether it's technically lock-free and surely impossible to write a tool to analyse the algorithm and determine if it is lock-free or at what point it is (logically) blocking.

No, it is not possible. Consider this function:

unsigned compute(unsigned x)
{
    while (x < 10) {
        if (x) {
            x++;
        }
    }
    return x;
}

It will run in bounded time, unless x is zero in which case it will take infinite time.

You cannot determine whether such functions exist in your program, because of the Halting Problem .

If you only need to determine whether your program calls specific system functions that you have determined to be blocking, such as network I/O, you can do that by interposing (via LD_PRELOAD , -fwrap or similar linking tricks) wrapper functions around those restricted system functions. For example you could write a wrapper for recv() which will check that the file descriptor is non-blocking, and return EINVAL otherwise.

Note that on many systems, disk I/O is fundamentally a blocking operation, so you'll need to disable that entirely.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM