【发布时间】:2016-10-25 02:06:24
【问题描述】:
我不确定我的术语是否正确,但这里是 - 我有这个函数被多个线程用来写入数据(使用 cmets 中的伪代码来说明我想要什么)
//these are initiated in the constructor
int* data;
std::atomic<size_t> size;
void write(int value) {
//wait here while "read_lock"
//set "write_lock" to "write_lock" + 1
auto slot = size.fetch_add(1, std::memory_order_acquire);
data[slot] = value;
//set "write_lock" to "write_lock" - 1
}
写入的顺序并不重要,我只需要让每个写入都进入一个唯一的插槽
不过,每隔一段时间,我需要一个线程来使用此函数读取数据
int* read() {
//set "read_lock" to true
//wait here while "write_lock"
int* ret = data;
data = new int[capacity];
size = 0;
//set "read_lock" to false
return ret;
}
所以它基本上换出缓冲区并返回旧缓冲区(我已删除容量逻辑以使 sn-ps 更短)
理论上这应该导致两种操作场景:
1 - 只是一堆线程写入容器
2 - 当某个线程执行读取函数时,所有新的写入者都必须等待,读取者将等待所有现有写入完成,然后执行读取逻辑,场景1可以继续。
问题部分是我不知道锁使用什么样的屏障-
自旋锁会很浪费,因为有很多这样的容器,它们都需要 cpu 周期
我不知道如何应用 std::mutex,因为我只希望写入函数在读取函数被触发时处于临界区。将整个写入函数包装在互斥体中会导致操作场景 1 不必要的减速。
那么这里的最佳解决方案是什么?
【问题讨论】:
-
我想这个问题可能会有所帮助stackoverflow.com/questions/14306797/…
-
所以您不需要在编写器线程之间同步它们,因为它们总是访问数据的唯一部分?
-
@Galik 在这种情况下,作者线程是池化的 AI、UI 和世界模拟效果,以各种频率运行,我需要将它们的输出一起传送到 GPU,GPU 以自己的更新间隔运行,但它们在运输过程中彼此无关
-
@user81993 在您的第一个代码 sn-p 中过度使用标识符
data是否可能出现拼写错误?局部变量正在遮蔽全局变量。 -
@NirFriedman 哦,是的,哎呀。
标签: c++ multithreading