C++ 14中的多平台跨线程通信

Mar*_*key 2 c++ multithreading

我有C++ 14程序,它使用线程从大文件加载数据.我使用std::thread和在方法中,数据被加载.但是,在加载数据后,我需要通知主线程(GUI,控制台...),数据已准备就绪.我怎样才能做到这一点?

我找到了这个https://www.codeproject.com/Articles/16726/Cross-thread-calls-in-native-C,但它只是Windows.在Linux上,我可以使用信号和中断,但我不认为这是一个好主意.

有没有任何C++ 14机制,允许你在threadID上调用方法XY,操作系统会安排它吗?

The*_*ist 6

答案: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();
Run Code Online (Sandbox Code Playgroud)

注意:我没有编译它.这是我的头脑.

通过这个例子,您可以看到您传递了一个promise set(),它将告诉另一个线程它已经准备好了.

创建线程时,使用应设置的promise传递data/class,并在完成后设置它.这将在您完成时告诉您的GUI.