c++ - C 和 C++ 原子之间的互操作性

标签 c++ c atomic

假设,我有一个任务可能会被另一个线程取消。该任务在 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/

相关文章:

c++ - 与其他语言相比,如何衡量 C 的 SNMP 性能?

c++ - Notepad++ 中 gcc 的最终设置 [使用 nppexec]

c++ - 快速整除测试(2、3、4、5、..、16)?

c++ - std::atomic::compare_exchange_weak 的虚假失败,以防值等于预期

java - Java中的原子compareAndSet方法是否有锁定?

c++ netbeans 显示语法错误,但编译和运行正确

C++ 模板编程问题预期 `;' 在 ‘it’ 之前?

c - 在 C 编程中接收控制代码

C:如何读取多个字符串片段并打印 #of 片段和 #of 字符

c# - 64 位 cpu 上的 64 位值的读/写是原子的吗?