AI_250 2020-04-23 18:39 采纳率: 0%
浏览 582

if判断条件已经满足,但是不执行if里的程序,必须延时才可以,请教原因

linux c 编程,while循环里,判断标志位的值,是变量的值是0,就打印出来,并赋值1,定时器里每1s,给变量直接赋值0,
但是定时器中修改了值之后,while里进不了if,必须要加个usleep延时才行

代码:

void signal_handler(int m)
{

printf("******m_socket_flag = %d  \n", m_socket_flag);
m_socket_flag = 0;

}

int main(int argc, char *argv[])
{
signal(SIGALRM, signal_handler);
set_timer(1); //定时1s,并在1s后启动
int h;
while (1)
{
usleep(1);

if (0 == m_socket_flag)
{
h++;
printf("m_socket_flag = %d /// h = %d\n", m_socket_flag,h);
m_socket_flag = 1;
}
}
}

加入了usleep(1)延时1us,则输出正常:

m_socket_flag = 0 /// h = 1
******m_socket_flag = 1

m_socket_flag = 0 /// h = 2
******m_socket_flag = 1

m_socket_flag = 0 /// h = 3
******m_socket_flag = 1

m_socket_flag = 0 /// h = 4
******m_socket_flag = 1

m_socket_flag = 0 /// h = 5
******m_socket_flag = 1

m_socket_flag = 0 /// h = 6
******m_socket_flag = 1

m_socket_flag = 0 /// h = 7
******m_socket_flag = 1

m_socket_flag = 0 /// h = 8

去掉usleep之后,就进不了if了:
m_socket_flag = 0 /// h = 1
******m_socket_flag = 1

******m_socket_flag = 0

******m_socket_flag = 0

******m_socket_flag = 0

******m_socket_flag = 0

******m_socket_flag = 0

******m_socket_flag = 0

******m_socket_flag = 0

请教各位,这是什么原因呢?一是想知道原因,二是发现即使有usleep的情况下,时间长了,也有一定概率,不能进if

  • 写回答

1条回答 默认 最新

  • Happy_Enger 2020-05-01 10:49
    关注

    試試volatile 修飾一下变量

    评论

报告相同问题?

悬赏问题

  • ¥15 请提供一个符合要求的网页链接。
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码