草庐IT

volatile

全部标签

c++ - 线程同步101

以前我写过一些非常简单的多线程代码,我一直都知道在我正在做的任何时候都可能有一个上下文切换,所以我总是通过以下方式保护访问共享变量一个CCriticalSection类,它在构造时进入临界区并在销毁时离开它。我知道这是相当激进的,我非常频繁地进入和离开关键部分,有时甚至令人震惊(例如,在函数开始时,我可以将CCriticalSection放在更紧凑的代码块中),但我的代码没有崩溃并且运行速度足够快.在工作中,我的多线程代码需要更紧密,仅在所需的最低级别进行锁定/同步。在工作中我试图调试一些多线程代码,我遇到了这个:EnterCriticalSection(&m_Crit4);m_bSo

c++ - 线程同步101

以前我写过一些非常简单的多线程代码,我一直都知道在我正在做的任何时候都可能有一个上下文切换,所以我总是通过以下方式保护访问共享变量一个CCriticalSection类,它在构造时进入临界区并在销毁时离开它。我知道这是相当激进的,我非常频繁地进入和离开关键部分,有时甚至令人震惊(例如,在函数开始时,我可以将CCriticalSection放在更紧凑的代码块中),但我的代码没有崩溃并且运行速度足够快.在工作中,我的多线程代码需要更紧密,仅在所需的最低级别进行锁定/同步。在工作中我试图调试一些多线程代码,我遇到了这个:EnterCriticalSection(&m_Crit4);m_bSo

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 如何使用 std::is_volatile?

我试图禁止对volatile类型的特定操作。为此,我尝试使用std::is_volatile,但下面的代码编译时没有错误,这不是我想要的。为什么is_volatile::valuefalse在下面的情况下?#includetemplateinlinevoidDoStuff(Tval){static_assert(!std::is_volatile::value,"Novolatiletypesplz");//...}intmain(){volatilecharsometext[261];DoStuff(sometext);} 最佳答案

c++ - 如何使用 std::is_volatile?

我试图禁止对volatile类型的特定操作。为此,我尝试使用std::is_volatile,但下面的代码编译时没有错误,这不是我想要的。为什么is_volatile::valuefalse在下面的情况下?#includetemplateinlinevoidDoStuff(Tval){static_assert(!std::is_volatile::value,"Novolatiletypesplz");//...}intmain(){volatilecharsometext[261];DoStuff(sometext);} 最佳答案

c++ - volatile关键字有什么用?

C/C++中volatile关键字有什么用?声明变量volatile和不声明为volatile有什么区别? 最佳答案 变量上的volatile限定符告诉编译器,无论何时访问此变量,它的值都必须从内存中加载,并且编译器可能不会从它以前的存储中假设该值生效了。因此,当您遇到变量可能具有当前“执行线程”(广义上)无法预见的值的情况时,它是合适的。这包括:硬件寄存器信号处理程序中的状态变量之后使用的实时变量goto等意外跳转,switch/case,或者,更重要的是,setjmp/longjmp.volatile对于对访问未互斥的线程共享变

c++ - volatile关键字有什么用?

C/C++中volatile关键字有什么用?声明变量volatile和不声明为volatile有什么区别? 最佳答案 变量上的volatile限定符告诉编译器,无论何时访问此变量,它的值都必须从内存中加载,并且编译器可能不会从它以前的存储中假设该值生效了。因此,当您遇到变量可能具有当前“执行线程”(广义上)无法预见的值的情况时,它是合适的。这包括:硬件寄存器信号处理程序中的状态变量之后使用的实时变量goto等意外跳转,switch/case,或者,更重要的是,setjmp/longjmp.volatile对于对访问未互斥的线程共享变

c++ - 指针可以是可变的吗?

考虑以下代码:intsquare(volatileint*p){return*p**p;}现在,volatile关键字表示内存位置可以以编译器未知的方式更改或具有其他未知的副作用(例如通过信号中断进行修改,硬件寄存器或内存映射I/O),即使在程序代码修改内容。那么当我们将指针声明为volatile时究竟会发生什么?上面提到的代码会一直有效吗,或者和这个有什么不同:intsquare(volatileint*p){inta=*p;intb=*preturna*b;}由于指针是易变的,我们可以最终将不同的数字相乘吗?或者有更好的方法吗? 最佳答案

c++ - 指针可以是可变的吗?

考虑以下代码:intsquare(volatileint*p){return*p**p;}现在,volatile关键字表示内存位置可以以编译器未知的方式更改或具有其他未知的副作用(例如通过信号中断进行修改,硬件寄存器或内存映射I/O),即使在程序代码修改内容。那么当我们将指针声明为volatile时究竟会发生什么?上面提到的代码会一直有效吗,或者和这个有什么不同:intsquare(volatileint*p){inta=*p;intb=*preturna*b;}由于指针是易变的,我们可以最终将不同的数字相乘吗?或者有更好的方法吗? 最佳答案