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?
Rough example.
C:
void do_task(atomic_bool const *cancelled);
C++:
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.
The 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.)