C++ 如何使单个生产者队列推送方法成为多生产者?

C++ 如何使单个生产者队列推送方法成为多生产者?,c++,multithreading,C++,Multithreading,我有一个生产者队列,我希望它能与多个线程一起工作。 队列只是一个简单的环形缓冲队列。我已经实现了一个pop方法,它适用于单个生产者-多个消费者。我不确定我的推送方法有什么问题 我尝试使用CAS循环作为写位置,但它只是暂停了我的程序,什么也不做 模板 结构mpWriter { 布尔推送(常数T和元件) { while(true){ uint oldWritePosition=writePosition.load(); uint newWritePosition=getPositionAfter(o

我有一个生产者队列,我希望它能与多个线程一起工作。 队列只是一个简单的环形缓冲队列。我已经实现了一个pop方法,它适用于单个生产者-多个消费者。我不确定我的推送方法有什么问题

我尝试使用CAS循环作为写位置,但它只是暂停了我的程序,什么也不做

模板
结构mpWriter
{
布尔推送(常数T和元件)
{
while(true){
uint oldWritePosition=writePosition.load();
uint newWritePosition=getPositionAfter(oldWritePosition);
//如果写入位置是旧的写入位置
//推进写入位置(因此,现在是新的写入位置
//并将数据写入旧的写入位置
//如果这有道理的话
if(writePosition.compare_exchange_strong(oldWritePosition,newWritePosition)){
环形缓冲区[oldWritePosition]。存储(元素);
返回true;
}
}
}
静态constexpr uint getPositionAfter(uint position)无异常
{
return++position==ringBufferSize?0:位置;
}
静态constexpuint ringBufferSize=size+1;
std::原子环缓冲区[ringBufferSize];
std::原子写位置=0;
};
intmain()
{
mps;
std::载体生产者;
对于(int i=0;i<50;++i){
producers.push_back(std::thread([&](){
内推(0);
}));
}
用于(汽车和生产商:生产商){
producer.join();
}
返回0;
}

代码有什么问题?如何正确编写?我不想使用任何外部队列。我想了解它是如何完成的。

什么意思?它只是暂停了您的程序?它没有终止吗?我看不出为什么它不应该终止-事实上,我只是尝试了一下,它会按预期终止。关于队列的逻辑,a例如:您应该注意,在换装的情况下,您可能会让生产者超过消费者,有效地覆盖尚未消费的商品!