【发布时间】:2022-01-22 06:29:59
【问题描述】:
我在单独的线程中加载资源,为此我使用无锁队列 (https://github.com/cameron314/concurrentqueue) 在主线程中我将项目添加到队列中。在加载线程中,我有一个循环,我将指针出列并加载数据。
while (loading_queue_.try_dequeue(ptr))
{
async_load(prt)
}
然后我将项目添加到另一个要在主线程中处理的无锁队列
void AsyncLoader::async_load(Data* data)
{
loader_->load_thread_a(data);
update_queue_.emplace(data); // can this code be executed before line above finishes?
}
在主标题中,我将项目出列添加完成加载
load_main_thread()
{
Data* data;
if (update_queue_.try_dequeue(data))
{
loader_->load_main_thead(data);
data->load_state = Loaded;
}
}
是否有可能 update_queue_.emplace(data);由于编译器重新排序指令或乱序执行,在 load_thread_a 之前发生? 我应该使用某种同步来防止它吗?
【问题讨论】:
-
什么是
load_thread_a? -
它对数据做了一些工作,主要是初始化或预计算取决于数据类型。它只是在加载线程中调用的函数
-
所以有 no 线程参与该功能?那么你就不需要同步了。
-
不,只有两个线程加载线程来自witch loading被调用,主线程来自wich load_main_thread被调用
-
首先,如果您提供minimal reproducible example 会有所帮助。询问关于潜在代码的是/否的问题并不是一个富有成效的方法。另外,我猜有些事情没有按预期工作,并且对于线程,有多种并行方式可以搞砸,但你甚至没有描述一个问题。
标签: c++ multithreading