68

帖子

0

TA的资源

一粒金砂(初级)

21
 
count =1;
那样两个进程的count如何同步?
只有用那些进程间同步的的内核对像才可以.

核心编程上说的是比较慢,因为需要一个应用模式到内核模式的切换,其实跑起来没什么差别的.




回复

117

帖子

0

TA的资源

五彩晶圆(高级)

22
 
引用 19 楼 nomad1982 的回复:
是的,可是这样还是无法保证共享内存中的其它数据能够同步访问!
关于我上面提到的问题

“假如按照设计AB都会遵守规则,当A从Sleep(0)中恢复过来时,刚准备设置count =-1;
确被更高优先级的C阻塞了,那我想问的是等C释放CPU后,系统是不是应该先恢复运行A,在轮转到B??
如果不是这样,而是一旦A被阻塞就需要排队到B后面,可能就是出现问题了!”

我查了下线程调度的机制,
所有线程从运行态转换到其它态最终都需要进入就绪态下…

你只要保证count访问的原子性就行了,其它共享数据在count不满足条件的情况下是不会被访问的。所以其它数据的访问也是同步的。
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

23
 
InterLocked函数似乎没有停等的功能,我写了下面函数来实现如果共享产生竞争,则进入超时模式来等待重新访问共享数据
void WriteLock()
{
    if( InterLockedCompareExchange(count,-1,0) != -1 )
    {
       //Lock request false, access timeout mode and continue to request..
       int i=3;
       for( i;i>0;i-- )
       {
          Sleep(0);
          if( InterLockedCompareExchange(count,-1,0) == -1 )
          {
             break;
          }
       }
    }
}

void WriteUnLock()
{
   if( InterLockedCompareExchange(count,0,-1) != 0 )
    {
       //Unlock request false, access timeout mode and continue to request..
       int i=3;
       for( i;i>0;i-- )
       {
          Sleep(0);
          if( InterLockedCompareExchange(count,0,-1) == 0 )
          {
             break;
          }
       }
       //timeout and give up
    }
}

main()
{
    WriteLock();
    DataCopy();
    WriteUnLock();
}
以这样的方式来做,不知是否可行??
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表