当前位置:  技术问答>linux和unix

问一个关于临界区同步的问题

    来源: 互联网  发布时间:2016-07-20

    本文导语:  下面是UNIX系统编程里的一道程序 #include #include #include #include static volatile sig_atomic_t doneflag = 0; static void setdoneflag(int signo) {             doneflag = 1; } int main(void) {   struct sigaction set;   int count = 0;   dou...

下面是UNIX系统编程里的一道程序
#include
#include
#include
#include
static volatile sig_atomic_t doneflag = 0;
static void setdoneflag(int signo)
{
            doneflag = 1;
}
int main(void)
{
  struct sigaction set;
  int count = 0;
  double sum = 0;
  double x;
  act.sa_handleer = setdoneflag;
  act.sa_flags = 0;
  if((sigemptyset(&act.sa_mask) == -1)||(sigaction(SIGINT,&act,NULL)==-1))
  {
     perror("Failed to set sigint handle");
     return 1;
  }
  while(!doneflag)
  {
    x = (rand()+0.5)/(RAND_MAX+1.0);
    sum += sin(x);
    count++;
    printf("count is %d and average is %fn",count,sum/count);
  }
  printf("program terminating...n");
  if(count == 0)
     printf("no values calculated yetn");
  else
     printf("count is %d and average is %fn",count,sum/count);
  return 0;
}
里面说因为可能在main函数检查doneflag的时候,信号处理函数对这个变量进行更改,所以doneflag设置成原子变量。
我想问一下,如果不设置doneflag为原子变量的话,在检查doneflag的时候对变量进行更改会发生什么情况?
我不设置为原子变量会有什么影响?

|
1.对整数进行判断(while(!doneflag))的话,分两步,1.从内存中去数据到寄存器,2.放入运算器,返回结果

如果在1和2之间发生中断,doneflag=1。然后中断返回,while条件仍然为假(其实变量已经为1,条件应该为真)
为了保证上述情况不发生,因此要将doneflag定义为原子类型,使之第一和第二之间不能发生中断。

至于3楼的那段应该是来自glic的手册中的。意思应该在gnu的编译器,整数被当成原子类型处理

但是不包含其他操作系统中,其他编译器怎么处理。因此最好自己手工定义为原子类型。

|
To avoid uncertainty about interrupting access to a variable, you can use a particular data
type for which access is always atomic: sig_atomic_t. Reading and writing this data type
is guaranteed to happen in a single instruction, so there's no way for a handler to run in
the middle" of an access.
The type sig_atomic_t is always an integer data type, but which one it is, and how
many bits it contains, may vary from machine to machine.
sig_atomic_t [Data Type]
This is an integer data type. Objects of this type are always accessed atomically.
In practice, you can assume that int is atomic. You can also assume that pointer
types are atomic; that is very convenient. Both of these assumptions are true on all

    
 
 

您可能感兴趣的文章:

  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 关于rsync同步的问题
  • 关于mount文件系统的同步问题
  • 关于邮件系统同步的问题,高手请进
  • 一个关于共享目录同步的问题
  • linux下的同步问题
  • 用信号量机制解决实际的三个进程同步问题
  • rsync同步问题
  • 请教: tcp传输同步问题
  • 共享内存和信号灯同步问题
  • linux 多线程sys_read同步问题
  • rsync和服务器同步的问题
  • 同步synchronized问题是否只在多线程中考虑,单线程中是否考虑,Why?
  • 在数据库应用中,多线程须不需要考虑同步问题,急!谢谢
  • mysql主从库不同步问题解决方法
  • 操作系统 同步互斥问题
  • samba性能配置问题:linux和window如何能保持同步
  • linux iis7站长之家
  • 进程同步问题
  • C++多线程同步问题!
  • svn web同步问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • 除了用现成的线程同步函数之外,能否自己写线程同步函数?
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • linux时钟为何与BIOS时钟不同步?如何使其同步?
  • Linux下用ntpdate同步时间及date显示设置时间
  • discuz免激活同步登入代码修改方法(discuz同步登录)
  • 内核同步?
  • 跨平台的文件同步工具 Capivara
  • 信息同步工具 SyncMate
  • 高清视频同步播放控制器 HDSync
  • NTP时间同步
  • 如何在一段程序同步几个变量??
  • linux服务器之间如何实现时间同步?
  • 日历同步统计 GCALDaemon
  • 数据同步和复制解决方案 SymmetricDS
  • linux虚拟机时间与windows时间如何同步
  • 集群同步工具 Csync2
  • 目录同步工具 DirSync
  • 文件夹比较和同步工具 FreeFileSync
  • centos5.2下的UNISON同步,无法自动执行!!!
  • 分布式数据同步系统 Databus


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3