Jak*_*ake 16 .net c# parallel-processing interlocked atomicity
我一直在使用C#,并且最近开始致力于为我的侧面项目添加并行性.因此,根据微软的说法,读取和写入int甚至浮点数都是原子的
我确信这些原子性要求在x86架构上运行得很好.但是,在ARM(可能没有硬件浮点支持)等体系结构上,似乎这些保证很难.
问题只是因为'int'总是32位而变得更加重要.有许多嵌入式设备无法自动执行32位写入.
这似乎是C#中的一个根本错误.保证这些数据类型的原子性不能轻松完成.
这些原子性保证如何在没有FPU或32位写入的架构上实现?
Ran*_*pho 12
使用运行时检查保证原子性并不太难.当然,你不会像高性能,你可能是,如果你的平台支持原子的读取和写入,但是这是一个平台的权衡.
结论:C#(核心语言,不包括某些特定于平台的API)与Java一样可移植.
这就是CLI的用途.我怀疑如果不符合要求,他们会认证实施.所以基本上,C#可以移植到任何一个平台上.
未来发生在昨天,C#实际上移植到大量嵌入式内核..NET Micro Framework是典型的部署方案.我看到列为本机目标的型号是AT91,BF537,CortexM3,LPC22XX,LPC24XX,MC9328,PXA271和SH2.
我不知道它们的核心指令集的确切实现细节,但我很确定这些都是32位内核,其中有几个是ARM内核.为它们编写线程代码需要最低限度的保证,正确对齐的单词的原子更新就是其中之一.鉴于支持的列表和对齐字的4字节原子更新在32位硬件中实现是微不足道的,我相信它们都支持它.
关于"可移植性"有两个问题:
语言提供的保证越强,将其移植到各种平台就越困难(某些保证可能会使在某些平台上实现该语言变得不可能或不切实际),但用该语言编写的程序越有可能在任何支持平台上进行无需修改的工作.
例如,许多网络代码依赖于(在大多数平台上)无符号字符为8位,32位整数由四个无符号字符以递增或递减顺序表示的事实.我使用了一个平台,其中char为16位,sizeof(int)== 1,sizeof(long)== 2.编译器作者可以让编译器简单地使用每个地址的底部8位,或者可能添加了许多额外的代码,以便编写'char'指针会将地址右移一位(保存lsb),读取地址,根据保存的地址lsb更新高或低一半,并将其写回.这些方法中的任何一种都可以允许网络代码在没有修改的情况下运行,但是会极大地阻碍编译器对其他目的的有用性.
CLR中的一些保证意味着在原子操作大小小于32位的任何平台中实现它是不切实际的.所以呢?如果微控制器需要超过几十K字节的代码空间和RAM,则8位和32位之间的成本差异非常小.由于没有人会在具有32K代码空间和4K内存的部分上运行CLR的任何变体,他们关心这样的芯片是否能够满足其保证.
顺便说一句,我认为在C规范中定义不同级别的功能会很有用; 例如,许多处理器都有8位字符,可以使用联合组合成更长的字,并且有很多实用的代码可以利用它.为那些使用这些东西的编译器定义标准会很好.我还希望在系统的低端看到更多标准,为8位处理器提供一些语言增强功能.例如,为函数定义重载将是有用的,该函数可以采用运行时计算的16位整数,8位变量或具有常量的内联扩展版本.对于经常使用的功能,它们之间的效率可能会有很大差异.
| 归档时间: |
|
| 查看次数: |
2944 次 |
| 最近记录: |