2010-07-28 65 views
0

更具体地说,我已(简化)如下:联合会的挥发性和非挥发性成员的语义是什么?

union foo 
    { 
    volatile int bits; 
    char data[sizeof(int)*CHAR_BIT]; 
    } 

如果我从来没有进入第一sizeof(int)项目data,我可以依靠bits如预期的工作?

+0

你能更具体什么你想实现? – kmalmur 2010-07-28 06:09:30

+0

@ mack369,我正在写一个内存分配器,并且正在尝试使其线程安全。 (Preemptivly:我这样做主要是作为相对低级别编程中的excersise,所以**不**使用更强大,测试良好等替代方案是有点暗示的。) – 2010-07-28 06:21:54

回答

2

基本上把结构的一个领域标记为volatile是正确的。但是你必须记住volatile关键字的作用。它告诉编译器不要优化对变量的访问。值总是从内存中读取,而不是从其寄存器中复制。

当您在评论中写入时,您正试图使内存分配线程安全。不幸的是,volatile并不能保证你可以从多个线程访问它。如果您使用8位CPU,则对整数值的访问不是原子操作,因此您的程序无法正常工作。

+0

我也使用原子内存访问builtins (特别是gcc的__sync_ * stuff *),这应该是访问线程安全的另一半(对吧?)。 (我也假设CPU有足够大的字大小,“int”将会是一个字)。 – 2010-07-28 06:45:56

+0

我还没有使用这种使内存访问原子化的方式。我更喜欢手动做 - 这是更便携的方式。 – kmalmur 2010-07-28 08:13:35

+0

手动原子内存访问的任何参考/教程? – 2010-07-28 08:43:28

0

volatile决不是对实现锁有用。我不是在讲理论上的;它失败,你有竞争条件,即使在单CPU /单核心环境。使真正的原子锁定原语的唯一方法是使用cpu的锁定原语(x86,锁前缀)编写程序集。

事实上,有可能是一种方法只volatile但只有这样的锁定机制,我知道需要O(n)空间,n是线程的数量,这使得相当无用获得通过,如果可能的线程数是未知提前。

+0

我在哪里说我在写锁?我试图写一个无锁内存分配器。 (我放弃并添加了锁,但不以任何方式与此问题相关。) – 2010-07-28 12:34:44

+0

对不起。出于好奇,你对无锁实现的想法是什么? – 2010-07-29 08:44:16

+0

我试图在整个malloc/free操作中保持内存缓存处于一致状态。这样做与个人块明显微不足道,但我无法弄清楚如何保持自由列表健全。如果我有任何新的想法,我可能会回来。 – 2010-07-29 16:12:57