更具体地说,我已(简化)如下:联合会的挥发性和非挥发性成员的语义是什么?
union foo
{
volatile int bits;
char data[sizeof(int)*CHAR_BIT];
}
如果我从来没有进入第一sizeof(int)
项目data
,我可以依靠bits
如预期的工作?
更具体地说,我已(简化)如下:联合会的挥发性和非挥发性成员的语义是什么?
union foo
{
volatile int bits;
char data[sizeof(int)*CHAR_BIT];
}
如果我从来没有进入第一sizeof(int)
项目data
,我可以依靠bits
如预期的工作?
基本上把结构的一个领域标记为volatile是正确的。但是你必须记住volatile关键字的作用。它告诉编译器不要优化对变量的访问。值总是从内存中读取,而不是从其寄存器中复制。
当您在评论中写入时,您正试图使内存分配线程安全。不幸的是,volatile并不能保证你可以从多个线程访问它。如果您使用8位CPU,则对整数值的访问不是原子操作,因此您的程序无法正常工作。
我也使用原子内存访问builtins (特别是gcc的__sync_ * stuff *),这应该是访问线程安全的另一半(对吧?)。 (我也假设CPU有足够大的字大小,“int”将会是一个字)。 – 2010-07-28 06:45:56
我还没有使用这种使内存访问原子化的方式。我更喜欢手动做 - 这是更便携的方式。 – kmalmur 2010-07-28 08:13:35
手动原子内存访问的任何参考/教程? – 2010-07-28 08:43:28
volatile
是决不是对实现锁有用。我不是在讲理论上的;它将失败,你将有竞争条件,即使在单CPU /单核心环境。使真正的原子锁定原语的唯一方法是使用cpu的锁定原语(x86,锁前缀)编写程序集。
事实上,有可能是一种方法只volatile
但只有这样的锁定机制,我知道需要O(n)
空间,n
是线程的数量,这使得相当无用获得通过,如果可能的线程数是未知提前。
我在哪里说我在写锁?我试图写一个无锁内存分配器。 (我放弃并添加了锁,但不以任何方式与此问题相关。) – 2010-07-28 12:34:44
对不起。出于好奇,你对无锁实现的想法是什么? – 2010-07-29 08:44:16
我试图在整个malloc/free操作中保持内存缓存处于一致状态。这样做与个人块明显微不足道,但我无法弄清楚如何保持自由列表健全。如果我有任何新的想法,我可能会回来。 – 2010-07-29 16:12:57
你能更具体什么你想实现? – kmalmur 2010-07-28 06:09:30
@ mack369,我正在写一个内存分配器,并且正在尝试使其线程安全。 (Preemptivly:我这样做主要是作为相对低级别编程中的excersise,所以**不**使用更强大,测试良好等替代方案是有点暗示的。) – 2010-07-28 06:21:54