我在这方面遇到了一些麻烦:
volatile uint32_t chunk_size;
volatile T* chunk;
std::vector<volatile T*>* chunks;
CRITICAL_SECTION cs;
...
void push(T item) {
EnterCriticalSection(&cs);
uint32_t slot = chunk_size++;
if (slot == chunk_capacity) {
chunk = new T[chunk_capacity];
chunks->push_back(chunk);
chunk_size = 1;
slot = 0;
}
chunk[slot] = item;
LeaveCriticalSection(&cs);
}
所以这应该是一个简单的线程安全推送。
我认为T * chunk需要是volatile,因为我不希望任何线程缓存该值,因为其中一个可能会重新分配并更改它。
向量本身不应该是易变的,因为即使其内容发生变化,对象本身也不会移动。
矢量模板类型我不确定,一方面c ++不会让我推动volatile类型所以我必须将它转换为非易失性。同时,它也是一个多个消费者容器,当其中一个弹出容器时,它会清除向量。因此,如果要缓存块[2]的地址,那么事情肯定会出错。
那么,矢量类型模板是否应该是易变的?