I prefer to fail as soon as possible. I use asserts in places where there is no good way to recover from a failed invariant.
If you want to define NDEBUG when compiling lthread, that's up to you.
assert(foo(bar) == 0);
with NDEBUG, foo will never even be called. I've seen some funky bugs from this in the past, like people calling malloc inside an assertion... Works great during dev, release build has NDEBUG defined, no test coverage... You get the picture.
A better idea would be to capture the return value in a var and do the assert on the var.