C 14中的乘数交叉线程通信

Multiplatform cross thread communication in C++14

本文关键字:线程 通信      更新时间:2023-10-16

我有C 14程序,该程序使用线程从大文件加载数据。我使用std::thread,在方法中,加载数据。但是,加载数据后,我需要通知主线程(GUI,Console ...(,该数据已准备就绪。我该如何实现?

我找到了此https://www.codeproject.com/articles/16726/cross-thread-calls-intagity-c,但仅是窗口。在Linux上,我可以使用信号和间隔,但我认为这不是一个好主意。

是否有任何C 14机制,可以让您在threadID上进行调用方法xy,并且OS会安排它?

答案: promisefuture

创建std::thread时,创建一个std::promise对象,然后将其传递到线程。例如:

std::promise<void> promise_that_data_is_loaded;
auto loaded_future = promise_that_data_is_loaded.get_future();
std::thread t([&promise_that_data_is_loaded]()
{
    loadData();
    promise_that_data_is_loaded.set(); //set this after work is done
});
while(loaded_future.wait_for(std::chrono::seconds(0)) != std::future_status::ready)
{
    //wait, or refresh GUI, or do other stuff, etc...
}
loaded_future.get();
t.join();

注意:我没有编译。这是我头顶的。

在此示例中,您会看到您通过一个承诺,即当set()时,会告诉另一个线程。

创建线程时,请通过应设置的承诺传递数据/类,然后在完成后将其设置。完成后,这会告诉您的GUI。