- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道编译器做出什么保证来确保对内存的线程写入在其他线程中具有可见的效果。
我知道有无数个案例存在这个问题,我敢肯定,如果您有兴趣回答这个问题,您也知道,但请关注我将要介绍的案例。
更准确地说,我担心会导致线程丢失其他线程完成的内存更新的情况。我不在乎(在这一点上)更新是非原子的还是同步不良:只要相关线程注意到更改,我就会很高兴。
我希望编译器能够区分两种变量访问:
例如,如果您采用此代码段:
void sleepingbeauty()
{
int i = 1;
while (i) sleep(1);
}
因为 i
是本地的,我假设我的编译器可以优化它,让睡美人永远沉睡。
void onedaymyprincewillcome(int* i);
void sleepingbeauty()
{
int i = 1;
onedaymyprincewillcome(&i);
while (i) sleep(1);
}
因为 i
是一个局部变量,但它的地址被获取并传递给另一个函数,我假设我的编译器现在知道它是一个“可寻址”变量,并生成内存读取到它确保也许有一天王子会来。
int i = 1;
void sleepingbeauty()
{
while (i) sleep(1);
}
由于 i
是一个全局变量,我假设我的编译器知道该变量有一个地址并将生成对其的读取而不是缓存该值。
void sleepingbeauty(int* ptr)
{
*ptr = 1;
while (*ptr) sleep(1);
}
我希望取消引用运算符足够明确,让我的编译器在每次循环迭代时生成内存读取。
我相当确定这是生产中的每个 C 和 C++ 编译器都使用的内存访问模型,但我认为没有任何保证。事实上,C++03 甚至对线程的存在视而不见,所以考虑到标准,这个问题甚至没有意义。不过,我不确定 C。
是否有一些文档可以说明我是对还是错?我知道这些都是浑水,因为这些可能不符合标准,这对我来说似乎是一个重要问题。
除了生成读取的编译器之外,我还担心 CPU 缓存在技术上可能会保留过时的值,而且即使我的编译器尽最大努力进行读取和写入,这些值也永远不会在线程之间同步。这会发生吗?
最佳答案
Accesses to variables that don't necessarily have an address.
所有变量都必须有地址(从语言的角度来看——允许编译器尽可能避免给事物提供地址,但这在语言内部是不可见的)。这是一个副作用,即一切都必须是“可指针的”,一切都有一个地址——即使是空类通常至少有一个 char
的大小,以便可以为它创建一个指针。
Since i is a local, but its address is taken and passed to another function, I assume that my compiler will now know that it's an "addressable" variables, and generate memory reads to it to ensure that maybe some day the prince will come.
这取决于onedaymyprincewillcome
的内容。编译器可以根据需要内联该函数,但仍然不进行内存读取。
Since i is a global, I assume that my compiler knows the variable has an address and will generate reads to it.
是的,但是否有人读取它真的无关紧要。这些读取可能只是缓存在您当前的本地 CPU 内核上,实际上并没有一路返回到主内存。为此,您可能需要内存屏障之类的东西,而没有 C++ 编译器会为您做这件事。
I hope that the dereference operator is explicit enough to have my compiler generate a memory read on each loop iteration.
不——不需要。该函数可能是内联的,这将允许编译器在需要时完全删除这些内容。
标准中唯一的语言功能,可以让您控制类似 w.r.t. 的东西。线程是 volatile
,它只需要编译器生成读取。这并不意味着该值会因为 CPU 缓存问题而保持一致——为此您需要内存屏障。
如果你需要真正的多线程正确性,你将使用一些特定于平台的库来生成内存屏障和类似的东西,或者你将需要一个支持 std 的 C++0x 编译器: :atomic
,它确实明确了对变量的这些类型的要求。
关于c++ - 现在的 C 和 C++ 编译器的线程保证是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434341/
我似乎无法让它发挥作用。我已经尝试过在线样本,但没有一个正是我需要的。基本上我希望能够显示从给定日期过去的天数。我下面的示例是 HTML 和 PHP 的组合,出于某些原因我不得不这样做。 Date
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
在此处搜索“线程关联”的答案,我发现人们对此很感兴趣,但没有什么理由可以节省可能获得稳定的 QueryPerformanceTimer 结果。 假设一个现代操作系统和一个现代 2-4 插槽工作站/服务
我有一个称为main-app的聚合物元素:
我有一个表,我想在每个插入时间记录每个订单的时间戳。但是,我得到的时间戳值为零。 这是我的架构: CREATE TABLE IF NOT EXISTS orders( orde
我正在使用 MongoDB Atlas 来托管数据库并使用这个无服务器函数查询数据: import { NextApiRequest, NextApiResponse } from "next"; /
苹果卸下了转义键,并用OLED触摸条替换了它。这对emacs用户具有影响,特别是对于具有数十年肌肉内存力才能克服此变化的UNIX/emacs用户而言。幸运的是,触摸栏逃生键似乎总是在您需要的时候出现,
抱歉,我对 DbGrids 还很陌生。 我是否应该使用查询的字段编辑器并以某种方式添加一个捕获 TIMEDIFF 的新字段,然后将其添加为我的 DbGrid 中的列? 或者我可以/应该跳过字段编辑器并
正如一本相当古老的书XUnit Patterns所写,NUnit 2.0不会为每个测试创建新的测试夹具,因此,如果测试正在操纵夹具的某种状态,则该夹具会被共享并且可能导致各种不良副作用。 还是一样吗?
我知道自2016年4月以来,Youtube API的默认配额限制为1M。 如果要增加它,我们需要向Google 发送请求。 我想知道我们可以要求的配额限制的最大值是多少? 最佳答案 根据Google开
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
{ "size": 0, "query": { "range": { "LogTime": { "gte": "now-1d",
当我尝试从终端编译这个简单的代码时: #include int main(void) { printf("%f\n",sqrt(10)); return 0; } 使用 gcc mai
我正在尝试筛选抓取一个 html 页面,以便我可以从中提取所需的有值(value)的数据并将其放入文本文件中。到目前为止,一切进展顺利,直到我在 html 页面中遇到了这个: In inventor
这是我的 结果 MySQL 表的示例: 我想将特定用户的所有日期向前移动相同的时间间隔,以便该用户的最高日期是当前时间戳。我知道如何获取以天为单位的间隔: /* result is 823 */ SE
我有一个函数需要从主视图中的几个不同位置调用。我们称它为 updateFunction。 我这样声明: - (void)updateFunction { //updates some vari
我正在尝试找出如何以某种方式嵌套回调。 var alpha = function(callback){ var x = 5; if(x > 2){ callback()
为什么我收到RangeError:超出最大调用堆栈错误?我正在尝试解析文本以找到数学并解决它。它一直有效,直到我开始实现括号'。我试图找出错误,但就是无法弄清楚。 我的代码: var alg = {
我记得几年前,没有使用 SSL 的原因之一是它占用了大量资源,因此影响了应用程序的性能。 如今,以当前的技术,这仍然是一个需要牢记的点吗? 这个问题的出现是因为一位同事担心使用 SSL 会影响他的应用
我正在将我的数据库从 sqlserver 迁移到 mysql当我在 sqlserver 中使用 getDate() 函数时,mysql 中的替换是 Now()但是 Now() 没有返回 getDate
我是一名优秀的程序员,十分优秀!