sig_atomic_t类型与volatile限定符

volatile:防止编译器优化

代码:

  1 #include<stdio.h>
  2 #include<signal.h>
  3 int a=0;
  4 void signal_handler(int signal)
  5 {
  6     printf("signal is coming\n");
  7     a=1;
  8 }
  9 int main()
 10 {
 11     signal(2,signal_handler);
 12   while(!a);
 13   return 0;
 14 
 15 }

结果:

[[email protected] SIGNAL]$ gcc -o thread_safety thread_safety.c -O3
[[email protected] SIGNAL]$ ./thread_safety 
^Csignal is coming
^Csignal is coming
^\退出 (core dumped)

编译器优化,直接从寄存器取值,为了防止优化,采用sig_atomic_t类型与volatile限定符。

4 volatile int a=0;
或
4 volatile sig_atomic_t  a=0;
结果:
[[email protected] SIGNAL]$ gcc -o thread_safety thread_safety.c -O3
[[email protected] SIGNAL]$ ./thread_safety 
^Csignal is coming
时间: 2024-10-12 21:00:28

sig_atomic_t类型与volatile限定符的相关文章

volatile限定符

备注:volatile的确切含义与机器有关,只能通过阅读编译器文档来理解.要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变. 直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制.例如,程序可能包含一个由系统时钟定时更新的变量.当对象的值可能在程序的控制或检测之外被改变时,应该将对象声明为volatile.关键字volatile告诉编译器不应该对这样的对象进行优化. volatile限定符的用法和const很相似,它起到

[汇编与C语言关系]5. volatile限定符

现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigned char recv; unsigned char send; /* memory buffer */ unsigned char buf[3]; int main(void) { buf[0] = recv; buf[1] = recv; buf[2] = recv; send = ~buf[0

C++ Primer 学习笔记_15_从C到C++(1)--bool类型、const限定符、const与#define、结构体内存对齐

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.bool类型(C语言没有) 1.逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 2.声明方式:bool result; result=true; 3.可以当作整数用(true一般为1,false为0) 4.把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false 5.示例 #include <iostream> using namespace

类型限定符volatile

volatile bool flag; volatile int a; 添加volatile限定符的变量会获得几个特性: 1.强制内存读取 因为这个数据是"易变的(volatile)",所以要时刻关注,不能偷懒 场景: 把内存中的变量拷贝到寄存器中进行处理以加快速度: 存在的问题: 是对变量的拷贝进行处理,而变量本体如果发生变化可能也不会察觉 解决: 加上volatile限定符后,每次处理都会直接从内存读取,所以可以感知变量的变化. 但是: 寄存器走了,缓存来了,但问题没那么严重 多核

C++语言学习(五)——C++语言中的CV限定符错误

C++语言学习(五)--C++语言中的CV限定符错误 ?一.CV限定符错误简介 1.CV限定符简介 CV限定符即cv-qualifier,C++语言中指const和volatile限定符.通常,C++语言中有两种情况不能使用CV限定符进行限定:A.非成员函数不能使用CV限定B.静态成员函数不能使用CV限定 2.CV限定符错误信息简介 C++语言中CV限定符错误信息如"cannot have cv-qualifier",常见的CV限定符错误信息如下:A.非成员函数的CV限定符错误信息er

const 不兼容的类型限定符问题

今天遇到一个问题,const对象调用成员函数的时候提示"不兼容的类型限定符"问题,查了一些资料,解决办法: 在成员函数后面加上 const关键字,例如: int get() const { return x; } 更进一步的原因是:const限定的对象以及其引用只能调用const限定的成员函数. const限定代表变量的值不会发生改变,要想不改变变量的值则只能调用const修饰的成员函数. 之前没有注意,mark一下.

解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题

今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告在某些情况下,可能正是bug的来源,并且这类bug往往非常难以定位.废话不多话,下面来解决问题. 看编译器给出的提示,是告诉我们,类型库当中的符号和系统符号有重名,同时也给出了解决方法,就是使用rename.怎么个rename法呢?其实很简单,我们在导入类型类的时候,直接#import语句后面,通过

ERROR C3848:具有类型&quot;const XXX&quot; 的表达式会丢失一些 const-volatile 限定符以调用&quot;YYY&quot; with&quot;ZZZ&quot;

今天看书,Thinking in c++ volume 2 "Adaptable function objects" 里面作者说: Suppose, for example, that we want to make the function object gt_n, definedearlier in this chapter, adaptable. All we need to do is the following: class gt_n : public unary_funct

C++说明符和限定符

有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11中不再是说明符);* register;* static;* extern;* thread_local(C++11新增的);* mutable.在同一个声明中不能使用多个说明符,但thread_local除外,它可与static或extern结合使用.在C++11之前,可以在声明中使用关键字aut