【问题标题】:在单独的线程中加载数据
【发布时间】: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


【解决方案1】:

如果您的队列实现有问题,这绝对有可能。但是如果队列被正确实现,它将使用正确的原子操作来防止编译器和处理器在加载实际完成之前使加载的对象可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多