Suppose, I have a task that might be cancelled from another thread. The task is performed in a C function, another thread runs C++ code. How do I do that?
void do_task(atomic_bool const *cancelled);
std::atomic_bool cancelled; … do_task(&cancelled);
For now, I created a file
atomics.h with the following content:
#ifdef __cplusplus #include <atomic> using std::atomic_bool; #else #include <stdatomic.h> #endif
It appears to work, but I don't see any guarantees for that. I wonder, if there is a better (correct) way.
atomic_bool type in C and the
std::atomic<bool> type in C++ (typedefed as
std::atomic_bool) are two different types that are unrelated. Passing a
std::atomic_bool to a C function expecting C's
atomic_bool is Undefined Behavior. That it works at all is a combination of luck and the simple definitions of these types being compatible.
If the C++ code needs to call a C function that expects C's
atomic_bool, then that is what it must use. However, the
<stdatomic.h> header does not exist in C++. You'll have to provide a way for the C++ code to call C code to get a pointer to the atomic variable you need in a way that hides the type. (Possibly declare a struct that holds the atomic bool, that C++ would only know that the type exists and only know about pointers to it.)