草庐IT

volatile

全部标签

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

c - 正确使用 volatile sig_atomic_t

根据this站点,可以使用volatilesig_atomic_t类型的变量在信号处理程序中。现在我的问题是,例如下面的代码仍然是原子的,因此不会引入竞争条件吗?假设我们正在使用多核处理器(编辑:运行多线程程序)。是否volatilesig_atomic_t甚至首先为多核系统工作,还是我们应该使用atomic多核系统上用于信号处理程序的C++11(编辑:运行多线程程序)?volatilesig_atomic_ta;staticvoidsignal_handler(intsig,siginfo_t*si,void*unused){intb;................b=...;a=

c - 正确使用 volatile sig_atomic_t

根据this站点,可以使用volatilesig_atomic_t类型的变量在信号处理程序中。现在我的问题是,例如下面的代码仍然是原子的,因此不会引入竞争条件吗?假设我们正在使用多核处理器(编辑:运行多线程程序)。是否volatilesig_atomic_t甚至首先为多核系统工作,还是我们应该使用atomic多核系统上用于信号处理程序的C++11(编辑:运行多线程程序)?volatilesig_atomic_ta;staticvoidsignal_handler(intsig,siginfo_t*si,void*unused){intb;................b=...;a=

java - 使用 volatile 关键字时出现内存一致性错误的示例?

来自文档:Usingvolatilevariablesreducestheriskofmemoryconsistencyerrors但这意味着有时volatile变量不能正常工作?奇怪的是如何使用它-在我看来,这是非常糟糕的代码,有时工作有时不工作。我尝试谷歌,但没有找到volatile的示例内存一致性错误。你能推荐一个吗? 最佳答案 问题不在于volatile工作不可靠。它总是按应有的方式工作。问题是它应该工作的方式有时不足以进行并发控制。如果在错误的情况下使用volatile,仍然会出现内存一致性错误。volatile变量将始终

java - 使用 volatile 关键字时出现内存一致性错误的示例?

来自文档:Usingvolatilevariablesreducestheriskofmemoryconsistencyerrors但这意味着有时volatile变量不能正常工作?奇怪的是如何使用它-在我看来,这是非常糟糕的代码,有时工作有时不工作。我尝试谷歌,但没有找到volatile的示例内存一致性错误。你能推荐一个吗? 最佳答案 问题不在于volatile工作不可靠。它总是按应有的方式工作。问题是它应该工作的方式有时不足以进行并发控制。如果在错误的情况下使用volatile,仍然会出现内存一致性错误。volatile变量将始终

c - 易变的变量

volatile变量存储在程序存储器的什么位置(在哪个部分)? 最佳答案 volatile是typequalifier不是storageclassspecifier,所以它根本不确定存储位置;它影响变量类型的定义,而不是它的存储。它只是强制编译器从变量的存储位置(无论可能在哪里)显式读取type为volatile的变量,而不是假设某个先前读取的值例如,在寄存器中仍然有效。 关于c-易变的变量,我们在StackOverflow上找到一个类似的问题: https:

c - 易变的变量

volatile变量存储在程序存储器的什么位置(在哪个部分)? 最佳答案 volatile是typequalifier不是storageclassspecifier,所以它根本不确定存储位置;它影响变量类型的定义,而不是它的存储。它只是强制编译器从变量的存储位置(无论可能在哪里)显式读取type为volatile的变量,而不是假设某个先前读取的值例如,在寄存器中仍然有效。 关于c-易变的变量,我们在StackOverflow上找到一个类似的问题: https:

c++ - volatile 是在 C/C++ 中生成单字节原子的正确方法吗?

我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU

c++ - volatile 是在 C/C++ 中生成单字节原子的正确方法吗?

我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU