假设,我有一个任务可能会被另一个线程取消。该任务在 C 函数中执行,另一个线程运行 C++ 代码。我该怎么做?
粗略的例子。
C:
void do_task(atomic_bool const *cancelled);
C++:
std::atomic_bool cancelled;
…
do_task(&cancelled);
现在,我创建了一个包含以下内容的文件 atomics.h
:
#ifdef __cplusplus
#include <atomic>
using std::atomic_bool;
#else
#include <stdatomic.h>
#endif
它似乎有效,但我看不到任何保证。我想知道,是否有更好(正确)的方法。
最佳答案
atomic_bool
输入 C 和 std::atomic<bool>
C++ 中的类型(类型定义为 std::atomic_bool
)是两种不相关的不同类型。通过 std::atomic_bool
到期望 C 的 atomic_bool
的 C 函数是未定义的行为。它能起作用是运气和这些类型的简单定义兼容的结合。
如果 C++ 代码需要调用需要 C 的 atomic_bool
的 C 函数,那么这就是它必须使用的。然而,<stdatomic.h>
标题 does not exist在 C++ 中。您必须为 C++ 代码提供一种方法来调用 C 代码,以隐藏类型的方式获取指向您需要的原子变量的指针。 (可能声明一个包含原子 bool 的结构,C++ 只会知道该类型存在并且只知道指向它的指针。)
关于c++ - C 和 C++ 原子之间的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53898429/