- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C++20 中,我们可以在原子变量上休眠,等待它们的值改变。
我们使用 std::atomic::wait
方法。
不幸的是,虽然 wait
已标准化,wait_for
和 wait_until
不是。这意味着我们不能在超时的原子变量上休眠。
无论如何,使用 WaitOnAddress 在幕后实现在原子变量上休眠在 Windows 和 futex 上Linux 上的系统调用。
解决上述问题(无法在具有超时的原子变量上休眠),我可以传递 std::atomic
的内存地址至WaitOnAddress
在 Windows 上,它将(有点)在没有 UB 的情况下工作,因为函数获取 void*
作为参数,投std::atomic<type>
有效至void*
在Linux上,是否可以混std::atomic
不清楚与 futex
. futex
得到一个 uint32_t*
或 int32_t*
(取决于您阅读的手册),并转换 std::atomic<u/int>
至u/int*
是UB。另一方面,手册说
The uaddr argument points to the futex word. On all platforms,futexes are four-byte integers that must be aligned on a four-byte boundary. The operation to perform on the futex isspecified in the futex_op argument; val is a value whose meaningand purpose depends on futex_op.
alignas(4) std::atomic<int>
应该可以工作,只要类型的大小为 4 字节且对齐为 4,它是哪种整数类型都没有关系。
最佳答案
您不必一定要实现完全自定义的 atomic
API,从 atomic<T>
中简单地拉出指向基础数据的指针实际上应该是安全的。并将其传递给系统。
由于std::atomic
不提供 native_handle
的等价物与其他同步原语提供的一样,您将被困在做一些特定于实现的黑客攻击以尝试使其与 native API 接口(interface)。
在大多数情况下,假设实现中这些类型的第一个成员与 T
相同是相当安全的。类型——至少对于整数值 [1]。这是一种保证,可以提取该值。
... and casting
std::atomic<u/int>
tou/int*
is UB
std::atomic
由标准保证为
Standard-Layout Type .标准布局类型的一个有用但通常深奥的属性是它是安全的
reinterpret_cast
一个
T
to a value or reference of the first sub-object (例如
std::atomic
的第一个成员)。
std::atomic<u/int>
仅包含
u/int
作为一个成员(或者至少作为它的第一个成员),那么以这种方式提取类型是完全安全的:
auto* r = reinterpret_cast<std::uint32_t*>(&atomic);
// Pass to futex API...
这种方法也应该在 windows 上转换
atomic
在将其传递给
void*
之前传递给基础类型API。
T*
指向
void*
的指针被重新解释为
U*
(例如
atomic<T>*
到
void*
当它期望
T*
时)是未定义的行为——即使有标准布局保证(据我所知)。它仍然可能会工作,因为编译器无法查看系统 API——但这不会使代码格式正确。
WaitOnAddress
上发言API,因为我实际上并没有使用它——但是任何依赖于正确对齐的整数值(
void*
或其他)地址的原子 API 都应该通过提取指向基础值的指针来正常工作。
C++20
,您可以使用
std::is_layout_compatible
进行验证与
static_assert
:
static_assert(std::is_layout_compatible_v<int,std::atomic<int>>);
(感谢@apmccartney 在评论中提出的这个建议)。
is_layout_compatible
并且您使用的是不同的系统,您可能需要检查编译器的头文件以确保此假设成立。
关于c++ - 将 std::atomic 与 futex 系统调用一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67034029/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!