Two threads working on shared data
This is correct code. It could go into production.

You don't need the memory barrier because SetEvent will do that for you (if it didn't a lot of code would be broken).

You could change this to use futures (provided that you have some C++ lib that supports them. I don't really know C++ well):

var data = PrepareData();
var boringComputation = StartSomeFuture([&amp;data] { ... });
var funComputation = ComputeFun(data);
var boringResult = boringComputation.ResultAndWait();


Much better.