Tag: 存储器障碍

强制执行C语句的顺序?

我遇到了MS C编译器重新排序某些语句的问题,这些语句在multithreading上下文中非常重要,并且处于高优化级别。 我想知道如何在特定的地方强制订购,同时仍然使用高水平的优化。 (在低优化级别,此编译器不重新排序语句) 以下代码: ChunkT* plog2sizeChunk=… SET_BUSY(plog2sizeChunk->pPoolAndBusyFlag); // set “busy” bit on this chunk of storage x = plog2sizeChunk->pNext; 产生这个: 0040130F 8B 5A 08 mov ebx,dword ptr [edx+8] 00401312 83 22 FE and dword ptr [edx],0FFFFFFFEh 其中pPoolAndBusyFlag的写入由编译器重新排序,在pNext fetch 之后发生。 SET_BUSY本质上是 plog2sizeChunk->pPoolAndBusyFlag&=0xFFFFFFFeh; 我认为编译器已经正确地决定重新排序这些访问是正确的,因为它们是同一结构的两个独立成员,并且这种重新排序对单线程执行的结果没有影响: typedef struct chunk_tag{ unsigned pPoolAndBusyFlag; // Contains pointer to owning pool and […]